Что такое gcc на linux, эквивалентном критическим разделам Microsoft? - PullRequest
7 голосов
/ 18 августа 2010

Компиляторы Microsoft Visual C ++ имеют EnterCriticalSection и ExitCriticalSection объекты для синхронизации между потоками.

Что такое эквивалент GCC?

Я вижу ссылки на __sync_synchronize вместе с __scoped_lock

На самом деле я вижу упоминание ряда атомарных __sync функций наряду с рядом __atomic единицы.

Я на самом деле использовал __sync_fetch_and_add для моего атомного приращения Должен ли я использовать __atomic_add_dispatch вместо этого?
Какая разница?

Какие из них я должен использовать? Существуют ли какие-либо конструкции в C ++, которые я могу использовать как в последней версии GCC, так и в Visual C ++ 2010, которые доступны, поскольку я собираюсь написать кроссплатформенный код.

Я вижу, что в boost есть некоторые функции, но по разным причинам мне не разрешено использовать boost под windows.

Ответы [ 4 ]

16 голосов
/ 18 августа 2010

В Linux (и других Unixen) вам нужно использовать PThreads или Posix Threads. В Windows нет эквивалента критическим разделам; используйте вместо этого мьютекс.

РЕДАКТИРОВАТЬ: см. Первый комментарий ниже - очевидно, что мьютексы Posix такие же, как критические разделы Win32 в том, что они связаны с одним процессом.

8 голосов
/ 15 октября 2013

Проверьте здесь: http://en.wikipedia.org/wiki/Critical_section

/* Sample C/C++, Unix/Linux */
#include <pthread.h>

/* This is the critical section object (statically allocated). */
static pthread_mutex_t cs_mutex =  PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

void f()
{
    /* Enter the critical section -- other threads are locked out */
    pthread_mutex_lock( &cs_mutex );

    /* Do some thread-safe processing! */

    /*Leave the critical section -- other threads can now pthread_mutex_lock()  */
    pthread_mutex_unlock( &cs_mutex );
}

int main()
{
    f();

    return 0;
}
2 голосов
/ 29 сентября 2014

Если вы разрабатываете программы только для платформы Windows, я думаю, что лучше всего использовать Win32 API. В противном случае вы можете использовать библиотеки Qt C ++ (для этого достаточно Qt Core).

См. Также: QMutex и QMutexLocker Вы также можете использовать: QReadWriteLock

2 голосов
/ 18 августа 2010

EnterCriticalSection, а остальные API - это Win32 API. Что касается API кроссплатформенной синхронизации, я не думаю, что они есть (поскольку вы упоминаете, что не можете использовать boost). Кроме того, вы упомянули о кроссплатформенности, означает ли это также разные архитектуры (например, для gcc). Я видел одну большую реализацию, где был предоставлен общий набор API-интерфейсов, которые были условно скомпилированы, чтобы иметь нативные API-интерфейсы (например, fetch_and_add в AIX) или использовали pthreads Win32 API-интерфейсов. Однажды я попытался использовать потоки posix на win32 , но столкнулся с множеством проблем (но это была очень старая версия). Сейчас YMMV.

...