Jeśli używasz GCC 4.7, niż można użyć nowego transakcyjna pamięci funkcji, aby wykonać następujące czynności:
transakcyjna pamięci jest przeznaczony do programowania z wątków prostszych, w szczególności dostępu do synchronizacji danych udostępnionych między kilkoma wątkami używającymi transakcji. Podobnie jak w przypadku baz danych, transakcja jest jednostką pracy, która kończy się w całości lub nie ma żadnego efektu (tj. Transakcje są wykonywane atomowo). Ponadto, transakcje są od siebie odizolowane, tak że każda transakcja widzi spójny widok pamięci.
Obecnie transakcje są obsługiwane tylko w C++ i C w postaci wyciągów transakcyjnych, wyrażeń transakcji i transakcji funkcji. W poniższym przykładzie, zarówno A i B zostanie odczytany, a różnica zostanie napisany do c, wszystko atomowo i odizolowany od innych transakcji:
__transaction_atomic { c = a - b; }
Dlatego inny wątek można użyć następującego kodu do jednoczesnego aktualizowania B bez zawsze powoduje c trzymać wartość ujemną (i bez konieczności stosowania innych konstrukcji synchronizacji, takich jak śluzy lub C++ 11 atomistyki):
__transaction_atomic { if (a > b) b++; }
Dokładne semantyki transakcji są zdefiniowane w kategoriach C++ 11 Model pamięci/C1X (patrz poniżej link do specyfikacji). Z grubsza transakcje zapewniają gwarancje synchronizacji, które są podobne do gwarancji gwarantowanych przy użyciu pojedynczego globalnego zamka jako strażnika dla wszystkich transakcji. Zauważ, że podobnie jak inne konstrukcje synchronizacji w C/C++, transakcje opierają się na programie wolnym od danych (na przykład zapis nietransakcyjny, który jest współbieżny z transakcyjnym odczytem w tej samej lokalizacji pamięci, jest wyścigiem danych).
Więcej informacji: http://gcc.gnu.org/wiki/TransactionalMemory
można opracować co masz na myśli przez „wykonywane atomowo”? Wygląda na to, że chcesz po prostu 'std :: mutex'. – Potatoswatter
To jest prawdopodobnie to, czego on naprawdę chce. – Joshua
Może ktoś powinien pokazać mu odpowiednią składnię do użycia 'std :: mutex'. Może on nie wie. Nie wiedziałbym, jak używać muteksa w niektórych innych językach. Wyjaśnienie powinno prawdopodobnie uwzględniać założenie, że cały program musi respektować muteks. To znaczy. wątek B może nadal wywoływać funcB i funcC, nawet jeśli wątek A robi to pod mutexem, chyba że programista zabrania go przez projekt. –