다음 코드가 있습니다. 간단한 다중 스레드 생산자 소비자 문제를 작성하기 위해 C ++ 11 스레드를 사용하고 있습니다.
class W
{
public:
explicit W();
void p();
void c();
private:
std::deque<std::uint64_t> q;
std::shared_ptr<std::mutex> m;
std::shared_ptr<std::condition_variable> cvQEmpty;
std::shared_ptr<std::condition_variable> cvQFull;
const std::size_t queue_size;
};
W::W()
: m(std::make_shared<std::mutex>()),
cvQEmpty(std::make_shared<std::condition_variable>()),
cvQFull(std::make_shared<std::condition_variable>()),
queue_size(3)
{
}
void
W::p()
{
while(1)
{
std::unique_lock<std::mutex> lk(*m.get());
if (q.size() >= queue_size)
{
cvQFull->wait(lk, [this] { return q.size() < queue_size; });
}
q.push_back(q.size());
std::cout << "Pushed " << q[q.size() - 1] << std::endl;
lk.unlock();
cvQEmpty->notify_one();
}
}
void
W::c()
{
while (1)
{
std::unique_lock<std::mutex> lk(*m.get());
if (q.empty())
{
cvQEmpty->wait(lk, [this] { return !q.empty(); });
}
while(!q.empty())
{
const std::uint64_t val = q[0];
std::cout << "Output : " << val << std::endl;
q.pop_back();
}
lk.unlock();
cvQFull->notify_one();
}
}
void
foo()
{
W w;
std::thread p(&W::p, w);
std::thread c(&W::c, w);
c.join();
p.join();
}
두 스레드 모두 조건 대기시 교착 상태가됩니다.
내가 어디로 잘못 가고 있는지 알려주세요. 프로그램은 경고없이 잘 컴파일됩니다.
사용 된 컴파일러 : g ++-5.8
아주 간단합니다. 당신은있다 복사 하여 w
복사 생성자를 호출, 두 스레드 인수를. 이러한 스레드는 두 개의 독립 대기열을 사용합니다!
해결책 :
shared_ptr
뮤텍스처럼 만드세요std::ref
.(참고로, explicit W()
아무것도 제공하지 않으며 구문 노이즈 일뿐입니다)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다