SDL_CreateThread и барьер памяти

184
12 февраля 2018, 04:29

До запуска дополнительного потока создается семафор, который используется в создаваемом потоке:

// Main thread:
SDL_sem* sem = SDL_CreateSemaphore(0);
SDL_CreateThread(...);
...
// Second thread:
SDL_SemWait(sem);

Вопрос - могут ли поменяться местами (компилятором/процессором) создание семафора и потока? (и возникнет ошибка при обращении к ещё не созданному семафору в новом потоке).

Answer 1

Ключевое свойство всех оптимизаций компиляторов придерживающихся стандартов в том, что они не меняют результат вычислений, если в исходном коде нет UB. Исходя из этого можно быть вполне уверенным, что компилятор не переставит местами вызовы функций, покуда не будет точно уверен, что у них нет побочных эффектов (например, для gcc если они не объявлены с __attribute__(pure)). Таким образом, если вызов SDL_CreateSemaphore(0) идёт до SDL_CreateThread(...), то можно не боятся, что при исполнении они как-то поменяются...

Конечно всегда может представить сферический компилятор в вакууме, который делает всё что ему вздумается, но это уже совсем другая история... Также может быть столь же сферическая библиотека реализующая свои вызовы, как отложенные, но это уже проблема библиотеки, и пользователь об этом беспокоиться не должен... И ни к любой вменяемой реализации SDL, ни к любому вменяемому компилятору это всё не относится...

READ ALSO
Функция cin.getline() [дубликат]

Функция cin.getline() [дубликат]

На данный вопрос уже ответили:

170
Ошибка use of undefined type

Ошибка use of undefined type

Есть два класса TextQuery и QueryResultПервый использует в методах второй и второй соответственно первый

197
как построить графики функций в vs2017 на с++ mfc?

как построить графики функций в vs2017 на с++ mfc?

как построить графики функций в vs2017 на с++ mfc?

154