2010-08-18 8 views
5

Los compiladores de Microsoft Visual C++ tienen los objetos EnterCriticalSection y ExitCriticalSection para permitir la sincronización entre subprocesos.¿Qué son gcc en el equivalente de Linux a las secciones críticas de microsoft?

¿Cuál es el equivalente de GCC?

veo referencias a alrededor __sync_synchronize junto con __scoped_lock

De hecho veo mención de una serie de funciones atómicas __sync junto con un número de __atomic queridos.

En realidad he estado usando __sync_fetch_and_add para mi incremento atómico ¿Debo estar usando __atomic_add_dispatch en su lugar?
¿Cuál es la diferencia?

¿Cuáles debo usar? ¿Hay algunas construcciones en C++ que puedo usar tanto en la última versión de GCC como en Visual C++ 2010 que están disponibles ya que voy a escribir algún código de plataforma cruzada?

Veo que el refuerzo tiene algunas funciones disponibles, pero por diversas razones no estoy autorizado a utilizar boost bajo Windows.

+0

supongo que no se puede usar cualquier otra biblioteca ni en ese momento? Qt tiene una bonita API de subprocesamiento (multiplataforma). – Job

Respuesta

13

En Linux (y en otros Unixen) necesita utilizar PThreads o Posix Threads. No hay equivalente a Secciones críticas en Windows; usa un Mutex en su lugar.

EDITAR: Ver el primer comentario a continuación - al parecer, los mensajes de texto mutados de Posix son los mismos que los de las secciones críticas de Win32 porque están vinculados a un único proceso.

+3

En realidad, los mutexes POSIX son equivalentes a las Secciones críticas de Win32 (limitadas por proceso); Los Mutexes de Win32 difieren de las Secciones críticas en ser procesos cruzados. – MSalters

+0

@MSalters: Ah, no lo sabía. Debe aplastar la reutilización de la terminología. –

+0

@MSalters, Además, las Secciones críticas de Win32 son mucho más rápidas que las exclusiones de Win32 porque se implementan en el espacio de usuario y no implican la sobrecarga asociada con la llamada al sistema. Aunque no sé sobre los mutexes de Posix. – Tanuj

2

EnterCriticalSection y el resto de las API son API de Win32. En cuanto a las API de sincronización multiplataforma, no creo que las haya (ya que mencionas que no puedes usar boost). Además, mencionó multiplataforma, ¿esto significa diferentes arquitecturas también (para la parte gcc, es decir). He visto una implementación de gran tamaño en la que se proporcionaba un conjunto común de API que se compilaba de forma condicional para tener las API nativas (como fetch_and_add en AIX) o se usa pthreads para las API de Win32. Una vez traté de usar posix threads on win32 pero me encontré con un montón de problemas (pero esa era una versión muy antigua). Ahora YMMV.

6

Marque aquí: 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 está desarrollando programas sólo para la plataforma Windows, creo que la mejor forma de hacerlo es utilizar la API de Win32. De lo contrario, puede usar las bibliotecas Qt C++ (para eso, Qt Core es suficiente).

Consulte también: QMutex y QMutexLocker También puede utilizar: QReadWriteLock

Cuestiones relacionadas