2012-01-19 15 views

Trả lời

14

C++ 03 không biết về sự tồn tại của luồng, do đó khái niệm về nguyên tử không có ý nghĩa nhiều đối với C++ 03, có nghĩa là nó không nói gì về điều đó.

C++ 11 không biết về chủ đề, nhưng một lần nữa không nói bất cứ điều gì về nguyên tử của việc gán con trỏ. Tuy nhiên C++ 11 có chứa std::atomic<T*>, được đảm bảo là nguyên tử.

Lưu ý rằng ngay cả khi ghi vào một con trỏ thô là nguyên tử trên nền tảng của bạn thì trình biên dịch vẫn miễn phí để di chuyển xung quanh đó, vì vậy mà không thực sự mua cho bạn bất cứ thứ gì.

Nếu bạn cần ghi vào con trỏ được chia sẻ giữa các chủ đề sử dụng std::atomic<T*> (hoặc chưa chính thức boost::atomic<T*>, gccs nội tại nguyên tử hoặc cửa sổ Lồng vào nhau *) hoặc bọc tất cả quyền truy cập vào con trỏ đó trong mutexes.

+0

Bạn có thể nhận được boost.atomic ở đây: http://www.chaoticmind.net/~hcb/projects/boost.atomic /doc/index.html –

2

Định mức C++ không xác định hành vi luồng cụ thể. Tùy thuộc vào trình biên dịch và nền tảng, việc gán con trỏ có thể hoặc không thể là nguyên tử.

+8

C++ 11 * không * xác định hành vi luồng và mô hình bộ nhớ liên quan. –

+1

@Frizlab và J.N. cả hai đều đúng. Như đã nói Porsche là một chiếc xe thể thao là một chính xác nhưng không chính xác, như không phải tất cả các mô hình là một chiếc xe thể thao :) – mloskot