如何解决C++11 多线程生产者/消费者程序挂起
我是 C++11 的新手并使用线程功能。在下面的程序中,主线程启动了 9 个工作线程,并将数据推入队列,然后等待线程终止。我看到工作线程没有被唤醒,程序只是挂起。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <vector>
#include <chrono>
#include <future>
#include <atomic>
using namespace std::chrono_literals;
std::mutex _rmtx;
std::mutex _wmtx;
std::queue<unsigned long long> dataq;
std::condition_variable _rcv;
std::condition_variable _wcv;
std::atomic_bool termthd;
void thdfunc(const int& num)
{
std::cout << "starting thread#" << num << std::endl;
std::unique_lock<std::mutex> rul(_rmtx);
while (true) {
while(!_rcv.wait_until(rul,std::chrono::steady_clock::Now() + 10ms,[] {return !dataq.empty() || termthd.load(); }));
if (termthd.load()) {
std::terminate();
}
std::cout<<"thd#" << num << " : " << dataq.front() <<std::endl;
dataq.pop();
_wcv.notify_one();
}
}
int main()
{
std::vector<std::thread*> thdvec;
std::unique_lock<std::mutex> wul(_rmtx);
unsigned long long data = 0ULL;
termthd.store(false);
for (int i = 0; i < 9; i++) {
thdvec.push_back(new std::thread(thdfunc,i));
}
for ( data = 0ULL; data < 2ULL; data++) {
_wcv.wait_until(wul,[&] {return data > 1000000ULL; });
dataq.push(std::ref(data));
_rcv.notify_one();
}
termthd.store(true);
_rcv.notify_all();
//std::this_thread::yield();
for (int i = 0; i < 9; i++) {
thdvec[i]->join();
}
}
我无法弄清楚问题所在。如何确保线程被唤醒并处理请求并正常终止?
解决方法
此 src/components/pages/page-1
将锁定 import { Component1 } from 'common/components'
互斥锁,直到主作用域结束。这肯定是一个问题,因为其他线程试图获取 static/maim.chunk.js
上的锁会阻塞:
std::unique_lock<std::mutex> wul(_rmtx);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。