2010-08-18 17 views
5

I compilatori Microsoft Visual C++ hanno gli oggetti EnterCriticalSection e ExitCriticalSection per consentire la sincronizzazione tra i thread.Quali sono le sezioni critiche di gcc on linux alle sezioni critiche di Microsoft?

Qual è l'equivalente GCC?

vedo riferimenti intorno a __sync_synchronize insieme __scoped_lock

In realtà vedo menzione di un certo numero di atomiche __sync funzioni con un certo numero di __atomic quelli.

In realtà ho utilizzato __sync_fetch_and_add per il mio incremento atomico Devo usare __atomic_add_dispatch invece?
Qual è la differenza?

Quali dovrei usare? Ci sono alcuni costrutti in C++ che posso usare sia nell'ultima versione di GCC e Visual C++ 2010 che sono disponibili visto che scriverò del codice cross-platform.

Vedo che l'amplificazione ha alcune funzioni disponibili, ma per vari motivi non mi è permesso usare boost sotto Windows.

+0

suppongo, non è possibile utilizzare qualsiasi altra libreria né allora? Qt ha una bella API di threading (multipiattaforma). – Job

risposta

13

Su Linux (e altri Unixen) è necessario utilizzare PThreads o Posix Threads. Non c'è equivalente a sezioni critiche su Windows; usa invece un Mutex.

MODIFICA: Vedere il primo commento di seguito: apparentemente Posix Mutex è lo stesso delle Sezioni critiche di Win32 in quanto sono associati a un singolo processo.

+3

In realtà, i mutex POSIX sono equivalenti a Sezioni critiche Win32 (con limiti di processo); I mutex Win32 differiscono dalle Sezioni critiche per essere cross-process. – MSalters

+0

@MSalters: Ah - non lo sapevo. Deve distruggere il riutilizzo della terminologia. –

+0

@MSalters, inoltre, le sezioni critiche di Win32 sono molto più veloci dei mutex Win32 poiché sono implementate nello spazio utente e non implicano l'overhead associato alla chiamata di sistema. Non so però i mutex di Posix? – Tanuj

2

EnterCriticalSection e il resto delle API sono API Win32. Per quanto riguarda le API di sincronizzazione multipiattaforma, non credo che ce ne siano (dal momento che menzioni che non puoi usare boost). Inoltre, hai menzionato multipiattaforma, questo significa anche diverse architetture (per la parte gcc i.e.). Ho visto un'implementazione di grandi dimensioni in cui è stato fornito un set comune di API che sono state compilate in modo condizionale per avere le API native (come fetch_and_add su AIX) o utilizzate pthreads per le API Win32. Una volta ho provato a usare posix threads on win32 ma ho riscontrato un sacco di problemi (ma quella era una versione molto vecchia). Ora YMMV.

6

Controllare qui: 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; 
} 
1

Se si sta sviluppando programmi solo per piattaforma Windows, penso che il modo migliore è utilizzare API Win32. Altrimenti puoi usare le librerie Qt C++ (a tale scopo è sufficiente Qt Core).

Consulta anche: QMutex e QMutexLocker È anche possibile utilizzare: QReadWriteLock

Problemi correlati