#包括<iostream> #包括<fstream #包含<线程> #包含<条件变量> #包括<队列> 标准::condition_variable cv; std::mutex mu; std::queue<int>queue; bool ready; 静态空心螺纹1(){ while(!ready){标准::thisthread::sleep_for(标准::计时::毫秒(10));} while(ready&&queue.size()<=4){ std::unique_lock<std::mutex>lk(mu); cv.wait(lk,[&]{return!queue.empty();}); 队列推送(2); } } 整型main(){ 就绪=假; 标准::螺纹t(螺纹1); while(queue.size()<=4){ { 标准::lock_guard<标准::mutex>lk(mu); queue.prush(1); } 就绪=真; 通知(); } t.join(); for(int i=0;i<=queue.size(); i++){ int a=queue.front(); 标准::cout<<a<<std::endl; queue.pop(); } 返回0; }
-
无法保证thread1能够在主循环再次锁定互斥锁之前获取互斥锁。 这就是多线程的运行方式,它可能是不可预测的。 – 乔纳森·波特 评论 2017年4月10日3:28 -
但我认为thread1中的条件变量会用wait锁定互斥锁,并同步main和thread1。 我可以做什么来同步以按顺序运行? – 9月 评论 2017年4月10日3:32 -
你有比赛条件。 螺纹1 可以执行 queue.size() 虽然 主要的 执行 队列推送(1) ,并且行为未定义。 – GManNickG公司 评论 2017年4月10日3:33 -
好的,我给thread1添加了一个带有sleep的就绪检查,以防止出现未定义、更新的代码。 但种族条件仍然存在。 – 9月 评论 2017年4月10日3:39 -
您正在访问 准备好的 来自两个单独的线程,但 准备好的 不考虑 原子的 .访问非- 原子的 多线程的值不安全/不明智/(可能是UB?) – 塔斯 评论 2017年4月10日3:57
2个答案
for(int i=0;i<=queue.size(); i++){ int a=queue.front(); 标准::cout<<a<<std::endl; queue.pop(); }
while(!queue.empty()){ int a=queue.front(); 标准::cout<<a<<std::endl; queue.pop(); }
#包括<iostream> #包括<fstream #包含<线程> #包含<条件变量> #包括<队列> 标准::condition_variable cv; 标准::condition_variable cv2; std::mutex mu; std::queue<int>queue; 滴答声; bool tock; 静态空心螺纹1(){ while(queue.size()<6){ 标准::unique_lock<标准::mutex>lk(mu); cv2.wait(lk,[]{return tock;}); 队列推送(1); tock=假; 勾选=真; 通知(); } } 整型main(){ 勾选=假; tock=真; 标准::螺纹t(螺纹1); while(queue.size()<6){ 标准::unique_lock<标准::mutex>lk(mu); cv.wait(lk,[]{return tick;}); 队列推送(2); 勾选=假; tock=真; cv2.notify_one(); } t.join(); while(!queue.empty()){ int r=queue.front(); queue.pop(); 标准::cout<<r<<std::endl; } 返回0; }