Nếu bạn đang sử dụng GCC 4.7 hơn bạn có thể sử dụng mới giao dịch Memory tính năng để làm như sau:
bộ nhớ giao dịch được thiết kế để làm cho chương trình với chủ đề đơn giản hơn, trong việc tiếp cận đồng bộ hóa đặc biệt để chia sẻ dữ liệu giữa một số chủ đề sử dụng giao dịch. Cũng như với cơ sở dữ liệu, giao dịch là một đơn vị công việc hoàn thành toàn bộ hoặc không có hiệu lực nào (tức là, các giao dịch thực thi nguyên tử). Hơn nữa, các giao dịch được tách biệt với nhau sao cho mỗi giao dịch nhìn thấy một bộ nhớ nhất quán về bộ nhớ.
Hiện tại, giao dịch chỉ được hỗ trợ trong C++ và C dưới dạng bảng sao kê giao dịch, biểu thức giao dịch và giao dịch chức năng. Trong ví dụ sau, cả a và b sẽ được đọc và sự khác biệt sẽ được ghi vào c, tất cả các nguyên tử và phân lập từ các giao dịch khác:
__transaction_atomic { c = a - b; }
Do đó, thread khác có thể sử dụng đoạn mã sau để đồng thời cập nhật b không bao giờ gây ra c để giữ một giá trị âm (và mà không cần phải sử dụng các cấu trúc đồng bộ khác như ổ khóa hoặc C++ 11 Atomics):
__transaction_atomic { if (a > b) b++; }
ngữ nghĩa chính xác của các giao dịch được quy định tại điều khoản của C++ 11/Mô hình bộ nhớ C1X (xem bên dưới để biết liên kết đến đặc điểm kỹ thuật). Nói chung, các giao dịch cung cấp các đảm bảo đồng bộ hóa tương tự như những gì sẽ được đảm bảo khi sử dụng một khóa toàn cầu duy nhất làm bảo vệ cho tất cả các giao dịch. Lưu ý rằng giống như các cấu trúc đồng bộ hóa khác trong C/C++, các giao dịch dựa vào một chương trình không có dữ liệu (ví dụ, một ghi không truyền dịch đồng thời với một giao dịch được đọc đến cùng một vị trí bộ nhớ là một cuộc đua dữ liệu).
Thông tin khác: http://gcc.gnu.org/wiki/TransactionalMemory
Nguồn
2012-03-18 15:54:20
Bạn có thể giải thích ý bạn bằng "thực thi nguyên tử" không? Có vẻ như bạn chỉ muốn một 'std :: mutex'. – Potatoswatter
Đó có lẽ là những gì anh ấy thực sự muốn. – Joshua
Có lẽ ai đó phải hiển thị cho anh ta cú pháp thích hợp để sử dụng 'std :: mutex'. Có lẽ anh ta không biết. Tôi sẽ không biết làm thế nào để sử dụng một mutex trong một số ngôn ngữ khác. Lời giải thích có lẽ nên bao gồm giả định rằng toàn bộ chương trình phải tôn trọng mutex. I E. thread B vẫn có thể gọi funcB và funcC ngay cả khi luồng A làm như vậy dưới một mutex, trừ khi lập trình viên cấm nó thông qua thiết kế. –