Страницы

Поиск по вопросам

четверг, 2 апреля 2020 г.

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

#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, ни к любому вменяемому компилятору это всё не относится...

Комментариев нет:

Отправить комментарий