Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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

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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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
我是否以线程安全的方式使用此deque? 我试图理解C++中的多线程。在下面的代码中,在retrieve()中声明的deque'tempData'是否总是让每个元素都处理一次且仅处理一次,或者是否会在多个线程中存在多个tempData副本,这些副本包含陈旧的数据,从而导致某些元素被多次处理?我不确定在这种情况下,通过引用传递是否会导致只有一个副本 static mutex m; void AudioAnalyzer::analysisThread(deque<shared_ptr<AudioAnalysis>>& aq) { while (true) { m.lock(); if (aq.empty()) { m.unlock(); break; } auto aa = aq.front(); aq.pop_front(); m.unlock(); if (false) //testing { retrieveFromDb(aa); } else { analyzeAudio(aa); } } } void AudioAnalyzer::retrieve() { deque<shared_ptr<AudioAnalysis>>tempData(data); vector<future<void>> futures; for (int i = 0; i < NUM_THREADS; ++i) { futures.push_back(async(bind(&AudioAnalyzer::analysisThread, this, _1), ref(tempData))); } for (auto& f : futures) { f.get(); } } 静态互斥锁m; void AudioAnalyzer::analysisThread(deque和aq) { while(true) { m、 锁(); if(aq.empty()) { m、 解锁(); 打破 } 自动aa=aq.front(); aq.pop_front(); m、 解锁(); if(false)//测试 { 检索数据库(aa); } 其他的 { 分析音频(aa); } } } void AudioAnalyzer::retrieve() { dequetempData(数据); 矢量期货; 对于(int i=0;i_C++_Multithreading_Thread Safety - Fatal编程技术网

我是否以线程安全的方式使用此deque? 我试图理解C++中的多线程。在下面的代码中,在retrieve()中声明的deque'tempData'是否总是让每个元素都处理一次且仅处理一次,或者是否会在多个线程中存在多个tempData副本,这些副本包含陈旧的数据,从而导致某些元素被多次处理?我不确定在这种情况下,通过引用传递是否会导致只有一个副本 static mutex m; void AudioAnalyzer::analysisThread(deque<shared_ptr<AudioAnalysis>>& aq) { while (true) { m.lock(); if (aq.empty()) { m.unlock(); break; } auto aa = aq.front(); aq.pop_front(); m.unlock(); if (false) //testing { retrieveFromDb(aa); } else { analyzeAudio(aa); } } } void AudioAnalyzer::retrieve() { deque<shared_ptr<AudioAnalysis>>tempData(data); vector<future<void>> futures; for (int i = 0; i < NUM_THREADS; ++i) { futures.push_back(async(bind(&AudioAnalyzer::analysisThread, this, _1), ref(tempData))); } for (auto& f : futures) { f.get(); } } 静态互斥锁m; void AudioAnalyzer::analysisThread(deque和aq) { while(true) { m、 锁(); if(aq.empty()) { m、 解锁(); 打破 } 自动aa=aq.front(); aq.pop_front(); m、 解锁(); if(false)//测试 { 检索数据库(aa); } 其他的 { 分析音频(aa); } } } void AudioAnalyzer::retrieve() { dequetempData(数据); 矢量期货; 对于(int i=0;i

我是否以线程安全的方式使用此deque? 我试图理解C++中的多线程。在下面的代码中,在retrieve()中声明的deque'tempData'是否总是让每个元素都处理一次且仅处理一次,或者是否会在多个线程中存在多个tempData副本,这些副本包含陈旧的数据,从而导致某些元素被多次处理?我不确定在这种情况下,通过引用传递是否会导致只有一个副本 static mutex m; void AudioAnalyzer::analysisThread(deque<shared_ptr<AudioAnalysis>>& aq) { while (true) { m.lock(); if (aq.empty()) { m.unlock(); break; } auto aa = aq.front(); aq.pop_front(); m.unlock(); if (false) //testing { retrieveFromDb(aa); } else { analyzeAudio(aa); } } } void AudioAnalyzer::retrieve() { deque<shared_ptr<AudioAnalysis>>tempData(data); vector<future<void>> futures; for (int i = 0; i < NUM_THREADS; ++i) { futures.push_back(async(bind(&AudioAnalyzer::analysisThread, this, _1), ref(tempData))); } for (auto& f : futures) { f.get(); } } 静态互斥锁m; void AudioAnalyzer::analysisThread(deque和aq) { while(true) { m、 锁(); if(aq.empty()) { m、 解锁(); 打破 } 自动aa=aq.front(); aq.pop_front(); m、 解锁(); if(false)//测试 { 检索数据库(aa); } 其他的 { 分析音频(aa); } } } void AudioAnalyzer::retrieve() { dequetempData(数据); 矢量期货; 对于(int i=0;i,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,在我看来没问题 线程具有共享内存,如果对tempData的引用在线程中显示为指针,则每个线程都会看到完全相同的指针值和tempData的同一个副本。[如果您愿意,可以通过一些全局代码或日志记录来检查。] 然后互斥锁确保单线程访问,至少在线程中是这样 有一个问题:在某个地方必须有一个推到deque上的按钮,并且可能还需要被互斥锁锁定。[显然,推回futures队列只是本地的。]是的,通过引用传递不会进行任何复制,因此所有线程都会共享您的原始tempData。您最好使用std::unique\u

在我看来没问题

线程具有共享内存,如果对tempData的引用在线程中显示为指针,则每个线程都会看到完全相同的指针值和tempData的同一个副本。[如果您愿意,可以通过一些全局代码或日志记录来检查。]

然后互斥锁确保单线程访问,至少在线程中是这样



有一个问题:在某个地方必须有一个推到deque上的按钮,并且可能还需要被互斥锁锁定。[显然,推回futures队列只是本地的。]

是的,通过引用传递不会进行任何复制,因此所有线程都会共享您的原始tempData。您最好使用std::unique\u lock。在您的情况下,在访问tempData期间不应该有任何异常,但这通常不是好的做法。我看不到比赛条件,所以你的代码应该是安全的。唯一的问题是,如果您直接将shared_ptr传递给analysisThread,您可能根本不需要tempData。据我记忆所及,std::async不能保证线程将被创建,因此您的NUM_线程使用情况是有问题的假设retrieve()只由一个线程调用,我是否需要push_back周围的互斥体?@svenoaks futures向量是本地的,所以不需要synchronize@svenoaks你说得对。此代码中未显示推压到deque上的操作。请参见编辑。