Если вы используете GCC 4.7, тогда вы можете использовать новую функцию Транзакционная память для выполнения следующих действий:
Транзакционная память призвана упростить программирование с потоками, в частности синхронизировать доступ к данным, разделяемым несколькими потоками с помощью транзакций. Как и в случае с базами данных, транзакция - это единица работы, которая либо завершается полностью, либо не имеет никакого эффекта (то есть транзакции выполняются атомарно). Кроме того, транзакции изолированы друг от друга, так что каждая транзакция видит согласованное представление о памяти.
В настоящее время транзакции поддерживаются только в C ++ и C в форме операторов транзакций, выражений транзакций и функциональных транзакций. В следующем примере будут прочитаны и a, и b, а разница будет записана в c, все атомарно и изолированно от других транзакций:
__transaction_atomic { c = a - b; }
Следовательно, другой поток может использовать следующий код для одновременного обновления b, даже не заставляя c содержать отрицательное значение (и не используя другие конструкции синхронизации, такие как блокировки или атомарные элементы C ++ 11):
__transaction_atomic { if (a > b) b++; }
Точная семантика транзакций определяется в терминах модели памяти C ++ 11 / C1X (см. Ниже ссылку на спецификацию). Грубо говоря, транзакции предоставляют гарантии синхронизации, аналогичные тем, которые были бы гарантированы при использовании единой глобальной блокировки в качестве защиты для всех транзакций. Обратите внимание, что, как и другие конструкции синхронизации в C / C ++, транзакции основаны на программе без гонки данных (например, нетранзакционная запись, которая одновременно с транзакционным чтением в ту же ячейку памяти является гонкой данных).
Дополнительная информация: http://gcc.gnu.org/wiki/TransactionalMemory