c++ - 为什么 Visual Studio 2019 中的 std:cout 中没有竞争条件?
问题描述
我想向朋友展示一个基于 std:cout 作为共享资源的简单竞争条件示例,如本文所述。
因此,我在一个全新的 Visual Studio 2019 控制台应用程序中输入了以下代码:
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void CallHome(string message)
{
cout << "Thread " << this_thread::get_id() << " says " << message << endl;
}
int main()
{
thread t1(CallHome, "Hello from Jupiter");
thread t2(CallHome, "Hello from Pluto");
thread t3(CallHome, "Hello from Moon");
CallHome("Hello from Main/Earth");
thread t4(CallHome, "Hello from Uranus");
thread t5(CallHome, "Hello from Neptune");
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
return 0;
}
根据这篇文章及其针对 Visual Studio 2015 的屏幕截图,我预计输出文本会被来自不同线程的交错片段弄乱。
但是,每次运行我的程序时,我始终得到以下输出:
Thread 1472 says Hello from Main/Earth
Thread 15112 says Hello from Jupiter
Thread 9248 says Hello from Neptune
Thread 17876 says Hello from Pluto
Thread 18452 says Hello from Uranus
Thread 18088 says Hello from Moon
那里发生了什么事?最近 C++ 运行时发生了什么变化?是不是与线程或 std:cout 相关的东西现在使它不受竞争条件的影响?
解决方案
我改为void CallHome(string message)
每个线程打印消息 100 次,
void CallHome(string message)
{
for (int i = 0; i < 100; ++i)
cout << "Thread " << this_thread::get_id() << " says " << message << endl;
}
我收到以下消息。
Thread 10588 says Hello from Uranus
Thread 10588 says Hello from Uranus
Thread 10588 says Thread 8116 says Hello from Neptune
Hello from Uranus
Thread 10588 says Hello from Uranus
可以在许多线程试图获取共享资源的情况下找到竞争条件。5次尝试太少,无法检查。
推荐阅读
- python-3.x - How to get parameters after # sign in aiohttp
- c++ - std::async 中的 std::getline 在超时后不会终止
- firebase - 没有特定 Content-Type 的 Firebase 函数返回未定义的 rawBody
- wordpress - 在 wordpress 中通过 cron 作业发送邮件
- amazon-web-services - AWS Lambda函数在执行时给出错误节点js
- elasticsearch - 在 Kibana 和 C# NEST 中使用逻辑 AND 查询
- android - 如何更改材料设计复选框中刻度线的颜色?
- node.js - CSV 到 Cloudant 导入大型数据集
- typescript - Firestore snapshotChanges DocumentChangeType "removed" never sent
- xml - Perl XML 使用 XML::LibXML 获取元素节点