Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个简单的C++;11四线程程序,如果我评论标准输出打印行,我的两个消费者线程不会返回 我正在通过C++ 11的同步原语学习我的方法。我必须为一个模板类编写这些方法,这个模板类是一个FIFO队列,其最大元素数是在构造时声明的_C++_Multithreading_C++11_Mutex_Condition Variable - Fatal编程技术网

在一个简单的C++;11四线程程序,如果我评论标准输出打印行,我的两个消费者线程不会返回 我正在通过C++ 11的同步原语学习我的方法。我必须为一个模板类编写这些方法,这个模板类是一个FIFO队列,其最大元素数是在构造时声明的

在一个简单的C++;11四线程程序,如果我评论标准输出打印行,我的两个消费者线程不会返回 我正在通过C++ 11的同步原语学习我的方法。我必须为一个模板类编写这些方法,这个模板类是一个FIFO队列,其最大元素数是在构造时声明的,c++,multithreading,c++11,mutex,condition-variable,C++,Multithreading,C++11,Mutex,Condition Variable,有两个线程将项目推入所述队列,两个线程检索项目。它们通过使用两个条件变量进行同步,以确保使用者线程仅在队列不为空时弹出项目,生产者线程仅在队列未满时推送新项目。队列具有打开/关闭状态,该状态用作两个条件变量的wait()调用中的附加条件。当队列关闭时,线程应该返回而不执行任何操作 // main.cpp #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]){ BlockingQueue<int> bq(10);

有两个线程将项目推入所述队列,两个线程检索项目。它们通过使用两个条件变量进行同步,以确保使用者线程仅在队列不为空时弹出项目,生产者线程仅在队列未满时推送新项目。队列具有打开/关闭状态,该状态用作两个条件变量的wait()调用中的附加条件。当队列关闭时,线程应该返回而不执行任何操作

// main.cpp
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[]){
    BlockingQueue<int> bq(10);
    int sum1=0, sum2=0;

    std::thread c1([&bq,&sum1](){
        int i;
        while(bq.get(i)) sum1+=i;
    });
    std::thread c2([&bq,&sum2](){
        int i;
        while(bq.get(i)) sum2+=i;
    });
    std::thread p1([&bq](){
    for(int i=0;i<1000;i+=2) bq.put(i);
    });
    std::thread p2([&bq](){
    for(int i=0;i<1000;i+=2) bq.put(i+1);
    });
    p1.join();
    std::cout<<"p1 thread returned."<<std::endl;
    p2.join();
    std::cout<<"p2 thread returned."<<std::endl;
    bq.close();
    c1.join();
    std::cout<<"c1 thread returned."<<std::endl;
    c2.join();
    std::cout<<"c2 thread returned."<<std::endl;
    std::cout<<"sum1: "<<sum1<<std::endl;
    std::cout<<"sum2: "<<sum2<<std::endl;
    std::cout<<"total: "<<sum1+sum2<<std::endl;
    return 0;
}
如果我改为注释cout行,那么这两个收集线程似乎永远不会返回,我无法理解我的代码出了什么问题。有人有线索吗?谢谢大家!

带有注释行的输出:

Rejoice! A bq has been created!
p1 thread returned.
p2 thread returned.

尝试添加get_条件。notify_all()和put_条件。notify_all()关闭()


据我所知,如果一个线程处于get_状态,那么当close()被调用时,它将永远处于get()中的wait()。我不知道为什么cout语句会起作用,尽管文档中确实提到了“虚假唤醒”。

这是有效的!谢谢。应通过使用wakeup条件作为第二个参数(以lambda表达式的形式传递给条件变量wake()调用)来处理虚假唤醒。
Inserting 998. After push size()=2
Extracted 997. After pop size()=1
p1 thread returned.
Inserting 999. After push size()=2
Extracted 998. After pop size()=1
p2 thread returned.
Extracted 999. After pop size()=0
Extracted 998. After pop size()=0
c1 thread returned.
c2 thread returned.
sum1: 250000
sum2: 249500
total: 499500
Rejoice! A bq has been created!
p1 thread returned.
p2 thread returned.