Có phải sinh ra một chủ đề cung cấp đảm bảo trật tự bộ nhớ?


20

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<>.
  • 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?


Tôi cho rằng tôi có thể thêm một số hình nộm std::atomic<int>... Bạn có thể sử dụng std::atomic_thread_fence.
Rin Kaenbyou

@NathanOliver d'oh. xóa bình luận. Tôi không thể đếm được tần suất bạn giúp tôi ở đây, bất kể câu hỏi của tôi ngu ngốc đến mức nào ...
idclev 463035818

1
@ idclev463035818 Không phải lo lắng. Điều đó đã xảy ra với tất cả chúng ta.
NathanOliver

Câu trả lời:


26

Tạo chủ đề là đủ. Có một điểm đồng bộ hóa giữa hàm tạo của luồng và bắt đầu của luồng mới trên mỗi [thread.thread.constr] / 7

Đồng bộ hóa: Việc hoàn thành việc gọi hàm tạo đồng bộ hóa với việc bắt đầu gọi bản sao của f.

Điều này có nghĩa là tất cả trạng thái trong luồng trước khi luồng mới được sinh ra sẽ hiển thị với luồng được sinh ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.