Tôi đang gặp vấn đề khi cố gắng đánh thức sợi chỉ bằng một cái khác. Một nhà sản xuất/điều tiêu dùng đơn giản.C++ 11 - không thể tỉnh táo một sợi chỉ bằng std :: thread và std :: condition_variable
Bên dưới mã. Dòng 85 là điểm tôi không hiểu tại sao nó không hoạt động. Chuỗi nhà sản xuất điền vào một hàng đợi :: std và gọi std :: condition_variable.notify_one() trong khi chuỗi tiêu thụ đang đợi NOT std :: queue.empty().
Cảm ơn trước sự giúp đỡ nào
#include <mutex>
#include <condition_variable>
#include <queue>
#include <string>
#include <iostream>
#include <thread>
// request
class request :
public std::mutex,
public std::condition_variable,
public std::queue<std::string>
{
public:
virtual ~request();
};
request::~request()
{
}
// producer
class producer
{
public:
producer(request &);
virtual ~producer();
void operator()();
private:
request & request_;
};
producer::producer(request & _request)
:
request_(_request)
{
}
producer::~producer()
{
}
void
producer::operator()()
{
while (true) {
std::lock_guard<std::mutex> lock(request_);
std::cout << "producer\n";
request_.push("something");
std::this_thread::sleep_for(std::chrono::seconds(1));
request_.notify_one();
}
}
class consumer
{
public:
consumer(request &);
virtual ~consumer();
void operator()();
private:
request & request_;
};
consumer::consumer(request & _request)
:
request_(_request)
{
}
consumer::~consumer()
{
}
void
consumer::operator()()
{
while (true) {
std::unique_lock<std::mutex> lock(request_); // <-- the problem
std::cout << "consumer\n";
request_.wait (
lock, [this] {return !request_.empty();}
);
request_.pop();
}
}
int
main()
{
// request
request request_;
// producer
std::thread producer_{producer(request_)};
// consumer
std::thread first_consumer_{consumer(request_)};
std::thread second_consumer_{consumer(request_)};
// join
producer_.join();
first_consumer_.join();
second_consumer_.join();
}
điên thừa kế – fasked
tại sao không? bạn có thể cho thấy một ví dụ ngắn gọn như thế nào? – user1587451
'std :: thread_self :: yield()' có thể giúp sau 'notify_xxx' –