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