1. static std::mutex m;
    2. void worker(int& result, std::condition_variable& cv, int set) {
    3. std::this_thread::sleep_for(std::chrono::milliseconds(200));
    4. result = set;
    5. cv.notify_all();
    6. }
    7. void consumer(std::condition_variable& cv, int idx) {
    8. std::unique_lock<std::mutex> lock(m);
    9. cv.wait(lock);
    10. std::cout << "consumer #" << idx << " receive notification" << std::endl;
    11. }
    12. int main(int argc, char* argv[]) {
    13. int cnt = 0;
    14. std::condition_variable cv;
    15. std::thread t1(worker, std::ref(cnt), std::ref(cv), 1);
    16. std::thread t2(worker, std::ref(cnt), std::ref(cv), 2);
    17. std::thread t3(consumer, std::ref(cv), 3);
    18. std::thread t4(consumer, std::ref(cv), 4);
    19. std::thread t5(consumer, std::ref(cv), 5);
    20. std::thread t6(consumer, std::ref(cv), 6);
    21. std::thread t7(consumer, std::ref(cv), 7);
    22. std::thread t8(consumer, std::ref(cv), 8);
    23. t1.detach();
    24. t2.detach();
    25. t3.detach();
    26. t4.detach();
    27. t5.detach();
    28. t6.detach();
    29. t7.detach();
    30. t8.detach();
    31. {
    32. std::unique_lock<std::mutex> lock(m);
    33. cv.wait(lock);
    34. std::cout << cnt << std::endl;
    35. }
    36. while (true) {
    37. std::this_thread::sleep_for(std::chrono::milliseconds(200));
    38. }
    39. return 0;
    40. }