cpp11cv.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <thread>
  2. #include <mutex>
  3. #include <condition_variable>
  4. #include <unistd.h>
  5. #include <list>
  6. #include <iostream>
  7. #include <chrono>
  8. class Task
  9. {
  10. public:
  11. Task(int taskID)
  12. {
  13. this->taskID = taskID;
  14. }
  15. void doTask()
  16. {
  17. std::cout << "handle a task, taskID: " << taskID << ", threadID: " << std::this_thread::get_id() << std::endl;
  18. }
  19. private:
  20. int taskID;
  21. };
  22. std::mutex mymutex;
  23. std::list<Task*> tasks;
  24. std::condition_variable mycv;
  25. void* consumer_thread()
  26. {
  27. Task* pTask = NULL;
  28. while (true)
  29. {
  30. std::unique_lock<std::mutex> guard(mymutex);
  31. while (tasks.empty())
  32. {
  33. //如果获得了互斥锁,但是条件不合适的话,pthread_cond_wait会释放锁,不往下执行。
  34. //当发生变化后,条件合适,pthread_cond_wait将直接获得锁。
  35. mycv.wait(guard);
  36. }
  37. pTask = tasks.front();
  38. tasks.pop_front();
  39. if (pTask == NULL)
  40. continue;
  41. pTask->doTask();
  42. delete pTask;
  43. pTask = NULL;
  44. }
  45. return NULL;
  46. }
  47. void* producer_thread()
  48. {
  49. int taskID = 0;
  50. Task* pTask = NULL;
  51. while (true)
  52. {
  53. pTask = new Task(taskID);
  54. //使用括号减小guard锁的作用范围
  55. {
  56. std::lock_guard<std::mutex> guard(mymutex);
  57. tasks.push_back(pTask);
  58. std::cout << "produce a task, taskID: " << taskID << ", threadID: " << std::this_thread::get_id() << std::endl;
  59. }
  60. //释放信号量,通知消费者线程
  61. mycv.notify_one();
  62. taskID ++;
  63. //休眠1秒
  64. std::this_thread::sleep_for(std::chrono::seconds(1));
  65. }
  66. return NULL;
  67. }
  68. int main()
  69. {
  70. //创建5个消费者线程
  71. std::thread consumer1(consumer_thread);
  72. std::thread consumer2(consumer_thread);
  73. std::thread consumer3(consumer_thread);
  74. std::thread consumer4(consumer_thread);
  75. std::thread consumer5(consumer_thread);
  76. //创建一个生产者线程
  77. std::thread producer(producer_thread);
  78. producer.join();
  79. consumer1.join();
  80. consumer2.join();
  81. consumer3.join();
  82. consumer4.join();
  83. consumer5.join();
  84. return 0;
  85. }