Этот вопрос основан на:
Когда можно безопасно уничтожить барьер pthread?
и недавний отчет об ошибке glibc:
http://sourceware.org/bugzilla/show_bug.cgi?id=12674
Я не уверен в проблеме семафоров, о которой сообщалось в glibc, но предположительно она должна быть действительной, чтобы уничтожить барьер, как только pthread_barrier_wait
вернется, согласно указанному выше вопросу. (Обычно нить, которая получила PTHREAD_BARRIER_SERIAL_THREAD
, или "специальную" нить, которая уже считала себя "ответственной" за барьерный объект, была бы той, которая уничтожила бы ее.) Основной пример использования, о котором я могу думать, - это когда барьер используется для синхронизации нового потока использования данных в стеке создания потоков, предотвращая возврат потока создания до тех пор, пока новый поток не будет использовать данные; другие барьеры, вероятно, имеют продолжительность жизни, равную жизни всей программы, или управляются каким-либо другим объектом синхронизации.
В любом случае как может гарантировать, что уничтожение барьера (и, возможно, даже разбиение памяти, в котором он находится) безопасно, как только pthread_barrier_wait
возвращается в любом потоке? Кажется, что другие потоки, которые еще не вернулись, должны были изучить хотя бы часть объекта барьера, чтобы закончить свою работу и вернуться, как и в приведенном выше сообщении об ошибке glibc, sem_post
должен проверить количество официантов после корректировки значения семафора.