微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++11 多线程生产者/消费者程序挂起

如何解决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 举报,一经查实,本站将立刻删除。