Компиляторы Microsoft Visual C ++ имеют объекты EnterCriticalSection
и ExitCriticalSection
для синхронизации между потоками.
Что такое эквивалент GCC?
Я вижу ссылки на __ sync_synchronize
вместе с __ scoped_lock
На самом деле я вижу упоминания о ряде атомарных __ sync
функций вместе с рядом
__ атомарных
.
На самом деле я использовал __ sync_fetch_and_add
для моего атомарного приращения
Следует ли мне использовать вместо __ atomic_add_dispatch
?
В чем разница?
Какие из них мне следует использовать? Есть ли в C ++ конструкции, которые я могу использовать как в последней версии GCC, так и в Visual C ++ 2010, которые доступны, поскольку я собираюсь писать кросс-платформенный код.
Я вижу, что у boost есть некоторые функции, но по разным причинам мне не разрешено использовать boost под окнами.
В Linux (и других Unixen) вам нужно использовать PThreads или Posix Threads. В Windows нет эквивалента «Критическим разделам»; вместо этого используйте мьютекс.
РЕДАКТИРОВАТЬ: См. Первый комментарий ниже - очевидно, что мьютексы Posix аналогичны критическим разделам Win32 в том смысле, что они привязаны к одному процессу.
EnterCriticalSection
, а остальные API - это Win32 API. Что касается кроссплатформенных API синхронизации, я не думаю, что они существуют (поскольку вы упомянули, что не можете использовать boost). Кроме того, вы упомянули о кросс-платформенности, означает ли это также различные архитектуры (для части gcc, то есть).
Я видел одну большую реализацию, где был предоставлен общий набор API, которые условно компилировались, чтобы иметь родные API (например, fetch_and_add на AIX) или использовали pthreads для Win32 API.
Однажды я пытался использовать posix threads на win32, но столкнулся с кучей проблем (но это была очень старая версия). Теперь YMMV.