Si está usando GCC 4.7 que puede utilizar la nueva memoria transaccional característica para hacer lo siguiente:
memoria transaccional tiene la intención de hacer la programación con hilos simples, en particular el acceso de sincronización de datos compartidos entre varios hilos utilizando transacciones. Al igual que con las bases de datos, una transacción es una unidad de trabajo que se completa en su totalidad o no tiene ningún efecto (es decir, las transacciones se ejecutan atómicamente). Además, las transacciones están aisladas entre sí de manera que cada transacción ve una vista coherente de la memoria.
Actualmente, las transacciones solo se admiten en C++ y C en forma de declaraciones de transacción, expresiones de transacción y transacciones de funciones. En el siguiente ejemplo, tanto a como b serán leídas y la diferencia se escribirán en c, todo atómicamente y aislada de otras transacciones:
__transaction_atomic { c = a - b; }
Por lo tanto, otro hilo puede utilizar el siguiente código para actualizar b simultáneamente sin siempre causando c para mantener un valor negativo (y sin tener que utilizar otros constructos de sincronización, tales como bloqueos o C++ 11 atómica):
__transaction_atomic { if (a > b) b++; }
la semántica precisos de las transacciones se definen en términos de la C++ 11/Modelo de memoria C1X (ver a continuación un enlace a la especificación). A grandes rasgos, las transacciones proporcionan garantías de sincronización que son similares a las que se garantizarían al usar un bloqueo global único como protección para todas las transacciones. Obsérvese que, al igual que otras construcciones de sincronización en C/C++, las transacciones dependen de un programa libre de carreras de datos (por ejemplo, una escritura no transaccional que es concurrente con una lectura transaccional en la misma ubicación de memoria es una carrera de datos).
Más información: http://gcc.gnu.org/wiki/TransactionalMemory
¿Puede explicar qué quiere decir con "ejecutada atómicamente"? Parece que solo quieres un 'std :: mutex'. – Potatoswatter
Eso es probablemente lo que realmente quiere. – Joshua
Quizás alguien debería mostrarle la sintaxis adecuada para usar un 'std :: mutex'. Quizás él no sabe. No sabría cómo usar un mutex en algunos otros idiomas. La explicación probablemente debería incluir la suposición de que todo el programa debe respetar el mutex. Es decir. el hilo B todavía puede invocar funcB y funcC, incluso si el hilo A lo hace bajo un mutex, a menos que el programador lo prohíba mediante el diseño. –