- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习线程,互斥等的基础知识。遵循here的文档和示例。在下面的代码中,我得到预期的输出。问题:
cv.notify_all();
吗? #include<mutex>
#include<iostream>
#include<thread>
#include<condition_variable>
std::mutex mtx;
std::condition_variable cv;
int currentlyRequired = 1;
void work(int id){
std::unique_lock<std::mutex> lock(mtx); // Line 11
while(currentlyRequired != id){
cv.wait(lock);
}
std::cout<<"Thread # "<<id<<"\n";
currentlyRequired++;
cv.notify_all();
}
int main(){
std::thread threads[10];
for(int i=0; i<10; i++){
threads[i] = std::thread(work, i+1);
}
for(int i=0; i<10; i++){
threads[i].join();
}
return 0;
}
/* Current Output:
Thread # 1
Thread # 2
Thread # 3
Thread # 4
Thread # 5
Thread # 6
Thread # 7
Thread # 8
Thread # 9
Thread # 10
Program ended with exit code: 0
*/
最佳答案
首先,我建议您在这里阅读文档:cppreference.com
对于将条件变量用于线程间等待和通知所需要遵循的关键点,您要谨慎得多。
我认为您的代码可以衡量。
您的代码将按照您的想法在第11行获得锁。 unique_lock
的其他构造函数将采用先前已锁定(由当前线程锁定)或未锁定(由当前线程锁定)的互斥锁,并在请求时将其锁定(此处为lock.lock();
)。
你所拥有的是正确的。您检查持有锁的相关数据。
等待,然后将其解锁(通过unique_lock
)并等待通知。
收到通知后,它将停止等待,再次将其锁定并循环检查条件。
最终,条件为真,并且每个线程(仍保持锁定状态)继续进行其“工作”。
“等待”方面看起来是正确的。 “通知”面也看起来是正确的。
必须修改包含互斥量的条件数据,以确保检查数据并进入条件变量管理的等待状态的正确同步。
您正确notify_all()
。即使在逻辑上(在此示例中)仅需要唤醒一个线程,也无法选择将其作为notify_one()
的目标。
因此,所有线程都被唤醒(如果挂起),请检查它们的状态,并且恰好其中之一可以识别出该线程并运行。
常识(和我的经验)是notify_all()
不持有锁会更好(并且更有效),因为等待的线程会醒来阻塞(在锁上)。但是我被告知某些平台在锁定状态下可以更好地进行通知。欢迎来到平台依赖的世界...
因此,就实现条件变量而言,我认为这是有效的,而且几乎是教科书。
也很高兴看到join()
。我有一个关于编码器未加入线程的错误。
这是您在小规模和高负载情况下无法使用的应用程序之一,但是当应用程序扩展并遇到高负载时,可能会引发问题和困惑。
我所做的工作没有并行性。
您已经实现了一条菊花链。这样做的目的是确保只有一个线程同时“执行工作”,并且它们必须严格执行。
为了利用并发性,我们希望最大化并行度-做“工作”的并行运行线程的数量(即,不是线程间通信的内务处理)和您的代码按字面意思(因为您做对了!)确保确保存在并发性永远不会有一个以上的线程在运行,并且代码由于保持工作而保证比单线程应用程序要慢一些(这将是for循环!)。
因此,它在程序正确性方面获得了最高的评价,但在有用方面没有任何评价!
在我看来,cplusplus.con和cppreference.com上的两个示例都稍好一点。
最好的介绍性例子是某种生产者消费者模型。
这更接近于实际有用的模式。
尝试简单的操作,例如一个生产者线程通过整数进行累加,然后多个消费者线程将它们平方并输出。
关键点在于,如果您做对了,则方块通常不会按顺序出现。
这些示例就像通过阶乘教学递归一样。当然,它是递归的,但是递归是计算阶乘的一种糟糕方法!
确保您的多线程(其他示例)有效,但是它们完全是并行的,无济于事!
请不要以为批评。作为“ dentry 切割”运动,您所拥有的是一流的。下一个任务是做一些有用的并发操作!
问题是我们不需要条件变量!根据定义,它们使线程彼此等待,从而减少了并行性。我们需要他们,他们会做自己的工作。但是,减少相互等待量(在锁定或条件下)的设计通常更好,因为这里的敌人正在等待,阻塞或(最差)旋转,而不是暂停的等待/阻塞。
这是为您的任务设计的更好的方案。更好,因为它完全避免了条件变量!!
#include<mutex>
#include<iostream>
#include<thread>
std::mutex mtx;
int currentlyRequired = 1;
void work(int id){
std::lock_guard<decltype(mtx)> guard(mtx);
const auto old{currentlyRequired++};
std::cout<<"Thread # "<<id<<" "<< old << "-> " <<currentlyRequired<< "\n";
}
int main(){
std::thread threads[10];
for(int i=0; i<10; i++){
threads[i] = std::thread(work, i+1);
}
for(int i=0; i<10; i++){
threads[i].join();
}
std::cout << "Final result: " << currentlyRequired << std::endl;
return 0;
}
标本输出:
Thread # 7 1-> 2
Thread # 8 2-> 3
Thread # 9 3-> 4
Thread # 10 4-> 5
Thread # 6 5-> 6
Thread # 5 6-> 7
Thread # 4 7-> 8
Thread # 3 8-> 9
Thread # 2 9-> 10
Thread # 1 10-> 11
Final result: 11
哪个线程执行哪个增量将有所不同。但是最终结果总是11。
关于c++ - 有没有比下面更好的方法来使用C++并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64464193/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在现代 IDE 中,有一个键盘快捷键可以通过键入文件名称来打开文件,而无需将手放在鼠标上。例如: Eclipse:Cmd|Ctrl + Shift + R -> 打开资源 IntelliJ:Cmd|C
有什么东西会等待事件发生(我正在等待的是 WebBrowser.DocumentCompleted),然后执行代码吗?像这样: If (WebBrowser.DocumentCompleted) 不会
我使用 PHP Minify,它很棒。但我的问题是,是否有任何 PHP 插件或其他东西可以自动检测 javascript/css 代码并自动缩小它?谢谢。 最佳答案 Javascript 压缩器? 看
有没有一种语言,类似什么CoffeeScript是JavaScript,编译成windows batch|cmd|command line的语言? 我指的cmd版本是基于NT的,尤其是XP sp3及以
我知道我可以 ,但是,我真的宁愿有一个任务,我可以从任何可以使用所有(或至少大部分)属性的操作系统调用 copy ,但这并没有消除 unix 上的权限。 我想知道是否已经有解决方案,或者我必须自己编
我正在使用 Vuejs(不使用 jQuery)开发一个项目,该项目需要像 jvectormap 这样的 map 但正如我所说,我没有使用 jQuery,那么是否有任何其他库可以在不使用 jQuery
想要进行一个简单的民意调查,甚至不需要基于 cookie,我不在乎投了多少票。有没有类似的插件或者简单的东西? 最佳答案 这是一个有用的教程 - 让我知道它是否适合您 using jQuery to
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
var FileBuff: TBytes; Pattern: TBytes; begin FileBuff := filetobytes(filename); Result := Co
我想要一个 vqmod xml 文件来添加一次上传多个图像的功能。身边有这样的事吗? 编辑:Opencart版本:2.1.0.1 最佳答案 最后我写了一个xml来添加到opencart 2.1.0.1
所以考虑这样的函数: public void setTemperature(double newTemperatureValue, TemperatureUnit unit) 其中Temperatur
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是 ggplot2 的新手,一直在尝试找到一个全面的美学列表。我想我理解它们的目的,但很难知道哪些可以在各种情况下使用(主要是几何图形?)。 Hadley 的网站偶尔会在各个几何图形的页面上列出可用
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
是否有任何 PHP 函数可以将整数转换为十万和千万? 900800 -> 9,00,800 500800 -> 5,00,800 最佳答案 由于您已在问题标签中添加了 Yii,因此您可以按照 Yii
使用 Clojure 一段时间后,我积累了一些关于它的惰性的知识。我知道诸如map之类的常用API是否是惰性的。然而,当我开始使用一个不熟悉的API(例如with-open)时,我仍然感到怀疑。 是否
我的项目需要一个像 AvalonDock 这样的对接系统,但它的最后一次更新似乎是在 2013 年 6 月。是否有更多...积极开发的东西可以代替它? 最佳答案 AvalonDock 实际上相当成熟并
我正在寻找一个可以逆转 clojure 打嗝的函数 所以 turns into [:html] 等等 根据@kotarak的回答,这现在对我有用: (use 'net.cgrand.enliv
我是一名优秀的程序员,十分优秀!