Tôi muốn làm điều này khoảng:
Chủ đề ban đầu:
- viết một số giá trị cho các vars toàn cầu (chúng sẽ không bao giờ được viết lại)
- Đây có thể là dữ liệu lớn vừa phải (mảng, chuỗi, v.v.). Không thể đơn giản được thực hiện
std::atomic<>
.
- Đây có thể là dữ liệu lớn vừa phải (mảng, chuỗi, v.v.). Không thể đơn giản được thực hiện
- sinh ra các chủ đề khác
Chủ đề khác:
- đọc trạng thái toàn cầu
- làm việc, v.v.
Bây giờ, tôi biết tôi có thể truyền các đối số cho std::thread
, nhưng tôi đang cố gắng hiểu các đảm bảo bộ nhớ của C ++ thông qua ví dụ này.
Ngoài ra, tôi khá tự tin rằng trên bất kỳ triển khai trong thế giới thực nào, việc tạo một luồng sẽ gây ra một rào cản bộ nhớ đảm bảo rằng luồng có thể "nhìn thấy" mọi thứ mà luồng gốc được viết cho đến thời điểm đó.
Nhưng câu hỏi của tôi là: điều này có được đảm bảo theo tiêu chuẩn không?
Ngoài ra: Tôi cho rằng tôi có thể thêm một số hình nộm std::atomic<int>
hoặc viết, và viết vào đó trước khi bắt đầu các chủ đề khác, sau đó trên các chủ đề khác, đọc nó một lần khi khởi động. Tôi tin rằng tất cả các máy móc xảy ra trước đó sẽ đảm bảo rằng trạng thái toàn cầu được viết trước đó có thể nhìn thấy đúng.
Nhưng câu hỏi của tôi là nếu một cái gì đó như thế là bắt buộc về mặt kỹ thuật, hoặc là tạo đủ luồng?
std::atomic<int>
... Bạn có thể sử dụngstd::atomic_thread_fence
.