2011-11-14 6 views
7

Đây là phiên bản đơn giản hóa của sự cố của tôi.C++ đồng bộ đa luồng

Có N đề thi sau 3 hướng dẫn trong một vòng lặp vô hạn:

A -> B -> C -> A -> B -> C -> A -> B -> ....... 

Tôi muốn rằng tất cả các chủ đề thực hiện hướng dẫn B đồng thời tức là thực hiện B bởi bất kỳ thread nên bắt đầu chỉ khi tất cả chủ đề đã đạt đến B. Vì vậy, nếu có một chuỗi đã thực hiện B -> C -> A, nó sẽ đợi ở đây cho đến khi các luồng khác cũng sẵn sàng thực hiện B.

Nếu có thể, vui lòng cho tôi biết giải pháp di động sẽ hoạt động trên cả hai cửa sổ & MAC.

+0

Chỉ ngày hôm qua ** [Bartosz Milewski đã đăng vidcast của mình lên C++ 11 Chuỗi đồng thời: 9. Biến điều kiện] (http://bartoszmilewski.wordpress.com/2011/11/13/c11-concurrency-series-9 -các biến điều kiện /) **. Tôi thấy nó thú vị nhất trong series (không cần phải xem những người khác đầu tiên, tôi nghĩ) – sehe

Trả lời

4

Bạn nên xem Boost thread library, đặc biệt là phần về condition variables.

+7

Mặc dù điều này nghe có vẻ giống như bạn muốn có một [rào cản] (http://www.boost.org/doc/libs/1_47_0/ doc/html/thread/synchronization.html # thread.synchronization.barriers) –

+0

@MikeSeymour: Tại sao bạn không thêm nó làm câu trả lời? – jgauffin

+0

Cảm ơn Mike, có vẻ như rào cản đó là những gì tôi cần. Hãy để tôi đi vào chi tiết của nó và quay lại trong trường hợp tôi gặp vấn đề. Cảm ơn một lần nữa! – arvin

0

Một loạt các ẩn dụ N-1 và một mutex? Tất cả các chủ đề có được mutex, inc một counter và, nếu nhỏ hơn N, giải phóng mutex và chờ trên mảng semaphore tại [counter]. Chủ đề thứ N tìm thấy bộ đếm là N, báo hiệu tất cả các semaphores, đặt lại bộ đếm là 0, thực thi 'B' giải phóng mutex và thoát. Các chủ đề khác, khi được giải phóng, cũng thực thi B nhưng không thể lặp lại và nhận lại cho đến khi luồng thứ N đã thực thi 'B' và phát hành mutex.

Tất cả hệ điều hành đa nhiệm đều có ẩn dụ/dấu mũ. Bạn có thể sử dụng một sự kiện, nếu có, thay vì semaphore.

+1

Trên thực tế, một semaphore báo hiệu [n-1] lần sẽ là tốt - không có mảng cần thiết với một semaphore, không giống như các sự kiện. –