2010-08-18 26 views
5

Les compilateurs Microsoft Visual C++ ont les objets EnterCriticalSection et ExitCriticalSection pour permettre la synchronisation entre threads.Que sont gcc sur l'équivalent de Linux pour les sections critiques de Microsoft?

Qu'est-ce que l'équivalent GCC?

Je vois des références autour de __sync_synchronize avec __scoped_lock

En fait, je vois mention d'un certain nombre de fonctions atomiques __sync avec un certain nombre de __atomic les.

En fait j'ai utilisé __sync_fetch_and_add pour mon incrément atomique Devrais-je utiliser __atomic_add_dispatch à la place?
Quelle est la différence?

Lesquels dois-je utiliser? Y a-t-il des constructions en C++ que je peux utiliser dans la dernière version de GCC et Visual C++ 2010 qui sont disponibles car je vais écrire du code multiplateforme.

Je vois boost a certaines fonctions disponibles, mais pour diverses raisons, je ne suis pas autorisé à utiliser boost sous Windows.

+0

Je suppose que vous ne pouvez pas utiliser une autre bibliothèque soit alors? Qt possède une API de threading sympa (multiplate-forme). – Job

Répondre

13

Sous Linux (et d'autres Unixen), vous devez utiliser PThreads ou Posix Threads. Il n'y a pas d'équivalent aux sections critiques sur Windows; utilisez un Mutex à la place.

EDIT: Voir le premier commentaire ci-dessous - apparemment Mutex Posix sont les mêmes que Win32 Critical Sections en ce sens qu'ils sont liés à un seul processus.

+3

En fait, les mutex POSIX sont équivalents aux sections critiques Win32 (limitées par des processus); Les mutex Win32 diffèrent des sections critiques en étant inter-processus. – MSalters

+0

@MSalters: Ah - je ne le savais pas. Doit écraser la réutilisation terminologique. –

+0

@ MSalters, aussi, Win32 Critical Sections sont beaucoup plus rapides que les mutex Win32 parce qu'ils sont implémentés dans l'espace utilisateur et n'impliquent pas la surcharge associée à l'appel système. Je ne connais pas les mutex de Posix? – Tanuj

2

EnterCriticalSection et le reste des API sont des API Win32. En ce qui concerne les API de synchronisation multiplateformes, je ne pense pas qu'il y en ait (puisque vous mentionnez que vous ne pouvez pas utiliser boost). En outre, vous avez mentionné cross-platform, cela signifie-t-il des architectures différentes aussi (pour la partie gcc c'est-à-dire). J'ai vu une grande implémentation où il y avait un ensemble commun d'API fournies qui étaient conditionnellement compilées pour avoir les API natives (comme fetch_and_add sous AIX) ou utilisaient pthreads les API Win32. J'ai déjà essayé d'utiliser posix threads on win32 mais j'ai rencontré beaucoup de problèmes (mais c'était une version très ancienne). Maintenant YMMV.

6

Vérifiez ici: 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

Si vous développez des programmes uniquement pour plate-forme Windows, je pense que la meilleure façon est en utilisant l'API Win32. Sinon, vous pouvez utiliser des bibliothèques Qt C++ (à cet effet, Qt Core est suffisant).

Voir aussi: QMutex et QMutexLocker Vous pouvez également utiliser: QReadWriteLock