#cpp #c #многопоточность #sdl2
До запуска дополнительного потока создается семафор, который используется в создаваемом потоке: // Main thread: SDL_sem* sem = SDL_CreateSemaphore(0); SDL_CreateThread(...); ... // Second thread: SDL_SemWait(sem); Вопрос - могут ли поменяться местами (компилятором/процессором) создание семафора и потока? (и возникнет ошибка при обращении к ещё не созданному семафору в новом потоке).
Ответы
Ответ 1
Ключевое свойство всех оптимизаций компиляторов придерживающихся стандартов в том, что они не меняют результат вычислений, если в исходном коде нет UB. Исходя из этого можно быть вполне уверенным, что компилятор не переставит местами вызовы функций, покуда не будет точно уверен, что у них нет побочных эффектов (например, для gcc если они не объявлены с __attribute__(pure)). Таким образом, если вызов SDL_CreateSemaphore(0) идёт до SDL_CreateThread(...), то можно не боятся, что при исполнении они как-то поменяются... Конечно всегда может представить сферический компилятор в вакууме, который делает всё что ему вздумается, но это уже совсем другая история... Также может быть столь же сферическая библиотека реализующая свои вызовы, как отложенные, но это уже проблема библиотеки, и пользователь об этом беспокоиться не должен... И ни к любой вменяемой реализации SDL, ни к любому вменяемому компилятору это всё не относится...
Комментариев нет:
Отправить комментарий