Các thư viện chuẩn C++ 11 được rộng rãi chủ đề an toàn. Việc đảm bảo an toàn chủ đề trên các đối tượng PRNG giống như trên các thùng chứa. Cụ thể hơn, vì các lớp PRNG là tất cả pseudo -random, tức là chúng tạo ra một chuỗi xác định dựa trên trạng thái xác định hiện tại, thực sự không có chỗ để nhìn trộm hoặc chọc vào bất kỳ thứ gì bên ngoài trạng thái chứa (người dùng).
Cũng giống như các thùng chứa cần khóa để làm cho chúng an toàn để chia sẻ, bạn sẽ phải khóa đối tượng PRNG. Điều này sẽ làm cho nó chậm và không xác định. Một đối tượng trên mỗi luồng sẽ tốt hơn.
1 phần này quy định các yêu cầu mà việc triển khai phải đáp ứng để ngăn chặn các cuộc đua dữ liệu (1.10). Mỗi chức năng thư viện chuẩn sẽ là đáp ứng từng yêu cầu trừ khi có quy định khác. Việc triển khai có thể ngăn chặn các cuộc đua dữ liệu trong các trường hợp khác với các trường hợp được chỉ định bên dưới.
2 A C++ chức năng thư viện chuẩn có trách nhiệm không trực tiếp hoặc gián tiếp đối tượng truy cập (1.10) thể truy cập bằng đề khác hơn là thread hiện hành trừ các đối tượng được truy cập trực tiếp hoặc gián tiếp thông qua các tuyên bố argu- các chức năng, bao gồm này.
3 A C++ thư viện tiêu chuẩn chức năng sẽ không trực tiếp hoặc gián tiếp sửa đổi đối tượng (1.10) thể truy cập bằng đề khác hơn là thread hiện hành trừ các đối tượng được truy cập trực tiếp hoặc gián tiếp thông qua đối số const phi các chức năng, bao gồm này.
4 [Lưu ý: Điều này có nghĩa, ví dụ, rằng hiện thực không thể sử dụng một đối tượng tĩnh cho mục đích nội bộ mà không cần đồng bộ hóa vì nó thể gây ra một cuộc chạy đua dữ liệu ngay cả trong các chương trình mà không chia sẻ một cách rõ ràng đối tượng betweenthreads. -endnote]
5 A C++ thư viện tiêu chuẩn chức năng sẽ không truy cập vào đối tượng gián tiếp truy cập thông qua đối số của nó hoặc thông qua các yếu tố của vật chứa nó đối số trừ bằng cách gọi các chức năng theo yêu cầu của đặc điểm kỹ thuật của nó trên những yếu tố container.
6 Các thao tác trên các trình vòng lặp thu được bằng cách gọi một thư viện chuẩn chức năng thành viên chuỗi hoặc chuỗi có thể truy cập vào thùng chứa cơ bản, nhưng không được sửa đổi. [Lưu ý: Cụ thể, các hoạt động của container làm mất hiệu lực các trình vòng lặp xung đột với các hoạt động trên các trình lặp vòng được kết hợp với vùng chứa đó. - end note]
7 Việc triển khai có thể chia sẻ các đối tượng bên trong của chúng giữa các chủ đề nếu đối tượng không hiển thị với người dùng và được bảo vệ khỏi dữ liệu chủng tộc.
8 Trừ khi có quy định khác, chức năng thư viện chuẩn C++ sẽ thực hiện tất cả các thao tác chỉ trong chuỗi hiện tại nếu các hoạt động có hiệu ứng hiển thị (1.10) cho người dùng.
9 [Lưu ý: Điều này cho phép thực hiện song song hoạt động nếu không có tác dụng phụ rõ ràng. - lưu ý cuối cùng]
Đó là cơ bản những gì tôi figured nó không phải là thread-an toàn. Có ok để chia sẻ các đối tượng phân phối 'std :: uniform_real_distribution zeroToOne (0.0, 1.0)' số lượng chủ đề và sử dụng một động cơ cho mỗi chủ đề? –
user1139069
@ user1139069: Không, không an toàn. Mặc dù ngay từ cái nhìn đầu tiên một đối tượng phân phối * có thể * thực hiện công việc của nó bằng cách ủy nhiệm mỗi cuộc gọi đến đối tượng động cơ, mà không duy trì trạng thái bên trong, nếu bạn nghĩ về nó thì động cơ không tạo ra đủ số bit ngẫu nhiên có thể cần phải được gọi hai lần. Nhưng hai lần (hoặc một lần) có thể là quá mức cần thiết, do đó, có thể tốt hơn để cho phép lưu vào bộ nhớ đệm của các bit ngẫu nhiên dư thừa. §26.5.1.6 \t "Yêu cầu phân phối số ngẫu nhiên" cho phép điều này; đối tượng phân phối cụ thể có trạng thái thay đổi theo từng cuộc gọi. Do đó chúng nên được coi là một phần của động cơ cho mục đích khóa. – Potatoswatter