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++; 我尝试在C++中使用. STD::MutX < /C> >和 STD::条件语句变量。 #include <iostream> #include<thread> #include<queue> #include<atomic> #include<mutex> #include<condition_variable> using namespace std; template<class T> class SafeQueue{ public: queue<T>qu; mutex mut; condition_variable cv; SafeQueue(){} SafeQueue(queue<T>q):qu(q){} void push(int val){ unique_lock<mutex>uq(mut); cv.wait(uq,[&](){return qu.empty();}); qu.push(val); uq.unlock(); } bool isEmpty(){ // unique_lock<mutex>uq(mut); // uq.unlock(); cv.notify_all(); return qu.empty(); } }; void inc(SafeQueue<int>& sq){ for(int i=0;i<10;i++) continue; if(sq.isEmpty()) sq.push(1); } void inc1(SafeQueue<int>& sq){ for(int i=0;i<10;i++) continue; if(sq.isEmpty()) sq.push(2); } int main(){ queue<int>qu; SafeQueue<int> sq(qu); thread t1(inc,ref(sq)); thread t2(inc1,ref(sq)); t1.join(); t2.join(); cout<<sq.qu.front(); } #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 样板 类安全队列{ 公众: 曲先生; 互斥mut; 条件变量cv; 安全队列(){} 安全队列(queueq):qu(q){} 无效推送(int val){ 唯一锁定(mut); cv.wait(uq,[&](){return qu.empty();}); qu.push(val); uq.unlock(); } 布尔是空的{ //唯一锁定(mut); //uq.unlock(); cv.通知所有人(); 返回qu.empty(); } }; void公司(安全队列和sq){ 对于(inti=0;i_C++_Multithreading_Condition Variable - Fatal编程技术网

线程安全队列c++; 我尝试在C++中使用. STD::MutX < /C> >和 STD::条件语句变量。 #include <iostream> #include<thread> #include<queue> #include<atomic> #include<mutex> #include<condition_variable> using namespace std; template<class T> class SafeQueue{ public: queue<T>qu; mutex mut; condition_variable cv; SafeQueue(){} SafeQueue(queue<T>q):qu(q){} void push(int val){ unique_lock<mutex>uq(mut); cv.wait(uq,[&](){return qu.empty();}); qu.push(val); uq.unlock(); } bool isEmpty(){ // unique_lock<mutex>uq(mut); // uq.unlock(); cv.notify_all(); return qu.empty(); } }; void inc(SafeQueue<int>& sq){ for(int i=0;i<10;i++) continue; if(sq.isEmpty()) sq.push(1); } void inc1(SafeQueue<int>& sq){ for(int i=0;i<10;i++) continue; if(sq.isEmpty()) sq.push(2); } int main(){ queue<int>qu; SafeQueue<int> sq(qu); thread t1(inc,ref(sq)); thread t2(inc1,ref(sq)); t1.join(); t2.join(); cout<<sq.qu.front(); } #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 样板 类安全队列{ 公众: 曲先生; 互斥mut; 条件变量cv; 安全队列(){} 安全队列(queueq):qu(q){} 无效推送(int val){ 唯一锁定(mut); cv.wait(uq,[&](){return qu.empty();}); qu.push(val); uq.unlock(); } 布尔是空的{ //唯一锁定(mut); //uq.unlock(); cv.通知所有人(); 返回qu.empty(); } }; void公司(安全队列和sq){ 对于(inti=0;i

线程安全队列c++; 我尝试在C++中使用. STD::MutX < /C> >和 STD::条件语句变量。 #include <iostream> #include<thread> #include<queue> #include<atomic> #include<mutex> #include<condition_variable> using namespace std; template<class T> class SafeQueue{ public: queue<T>qu; mutex mut; condition_variable cv; SafeQueue(){} SafeQueue(queue<T>q):qu(q){} void push(int val){ unique_lock<mutex>uq(mut); cv.wait(uq,[&](){return qu.empty();}); qu.push(val); uq.unlock(); } bool isEmpty(){ // unique_lock<mutex>uq(mut); // uq.unlock(); cv.notify_all(); return qu.empty(); } }; void inc(SafeQueue<int>& sq){ for(int i=0;i<10;i++) continue; if(sq.isEmpty()) sq.push(1); } void inc1(SafeQueue<int>& sq){ for(int i=0;i<10;i++) continue; if(sq.isEmpty()) sq.push(2); } int main(){ queue<int>qu; SafeQueue<int> sq(qu); thread t1(inc,ref(sq)); thread t2(inc1,ref(sq)); t1.join(); t2.join(); cout<<sq.qu.front(); } #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 样板 类安全队列{ 公众: 曲先生; 互斥mut; 条件变量cv; 安全队列(){} 安全队列(queueq):qu(q){} 无效推送(int val){ 唯一锁定(mut); cv.wait(uq,[&](){return qu.empty();}); qu.push(val); uq.unlock(); } 布尔是空的{ //唯一锁定(mut); //uq.unlock(); cv.通知所有人(); 返回qu.empty(); } }; void公司(安全队列和sq){ 对于(inti=0;i,c++,multithreading,condition-variable,C++,Multithreading,Condition Variable,而言,这并不意味着程序不是线程安全的,也不意味着程序定义不正确,可能会崩溃 这只是意味着程序的逻辑不是为了按任何特定顺序将项目添加到队列中而编写的 如果您希望按特定顺序添加这两个项目,请从一个线程中同时推送这两个项目 线程安全并不意味着您的应用程序运行时就好像只有一个线程一样 您的程序运行正常。您的代码在几个方面存在缺陷: 无论何时访问共享结构,都必须使用互斥锁进行保护。您有互斥锁,但不在isEmpty()中使用。记录该连接,这一点很重要,不要迷失方向。此外,对CV也要这样做,在发送信号时记录

而言,这并不意味着程序不是线程安全的,也不意味着程序定义不正确,可能会崩溃

这只是意味着程序的逻辑不是为了按任何特定顺序将项目添加到队列中而编写的

如果您希望按特定顺序添加这两个项目,请从一个线程中同时推送这两个项目

线程安全并不意味着您的应用程序运行时就好像只有一个线程一样


您的程序运行正常。

您的代码在几个方面存在缺陷:

  • 无论何时访问共享结构,都必须使用互斥锁进行保护。您有互斥锁,但不在
    isEmpty()
    中使用。记录该连接,这一点很重要,不要迷失方向。此外,对CV也要这样做,在发送信号时记录
  • 关于
    isEmpty()
    ,该函数无论如何都是无用的。即使队列在某个时间点不是空的,也没有任何东西可以阻止它在下一秒变为空
  • 请重新阅读
    unique\u lock
    的文档。您的使用方法比必要的复杂得多
  • CV的使用也很奇怪:通常,你用它来通知服务员一个变化。你在一个函数中无条件地发出信号,这个函数似乎只查询某个状态

为您提供的工作示例:检查我的tlock:谢谢您的建议,但我想了解我的代码有什么问题。如果有问题,请提出建议me@AbhinavSingh我已经告诉过你了。没什么。它正在工作。唯一错误的是你对应该发生的事情的期望……我在isEmpty中使用互斥锁(函数i
sEmpty()
中的注释代码)但是它不起作用,产生了相同的结果,所以我取消了注释,看看它是否给出了正确的输出。关于
unique\u lock
我想它是我在我的程序中上面写的那样使用的。那么,你在这里发布的问题很糟糕:我只能评论你提供的代码,不能评论你在其他地方或以前尝试过的代码。请澄清!但我的实际答案应该是1,因为我先推它,然后函数
inc1()
将运行,这更像是一个并发进程。如果我错了,你能为我提供一个有效的逻辑来实现这一点。还有一件事,当我在两个线程中使用相同的函数时,它只是挂起在运行时(等待一个线程完成)但我认为在这种情况下不会产生任何死锁情况。@AbhinavSingh在什么意义上你是“先推它”?两个线程同时运行(“同时”)。这就是线程的全部要点。如果您不想要并发,请不要使用并发。您能告诉我什么是线程安全队列吗(我是多道程序设计新手)这就是我想要的吗?很抱歉这个奇怪的问题?@AbhinavSingh我不知道你想要什么。你应该复习一下你的多线程编程书。@AbhinavSingh你不能只是在一个问题上抛出线程来“让它变快”。这不是它的工作原理。如果你真的要求它,你的程序将是最快的,并且满足你的需求“推1”,然后让它“推2”。按顺序,按顺序。就是这样。让这两件事“同时发生”除了移除排序约束之外,没有任何作用。这不是线程的用途。当你有几个线程时,你就使用线程[主要是]由于一个或另一个块的原因,或者为了使用多个CPU,为了节省时间而并行进行的不相关操作。