Mer*_*kiz 3 c++ multithreading c++11
我开始学习C++ 11标准中的线程,我正在尝试一个非常基本的程序,它创建10个线程,加入它们然后退出.在线程函数中,我试图打印出我正在创建线程的for循环的索引,如下所示:
std::vector<std::thread> threads;
for(int i = 0; i < 10; i++)
{
threads.push_back(std::thread([i](){ printf("Thread #%d\n", i); }));
}
Run Code Online (Sandbox Code Playgroud)
这会产生一个预期来自并发程序的输出,线程执行顺序:
Thread #0
Thread #2
Thread #1
Thread #3
Thread #4
Thread #5
Thread #6
Thread #7
Thread #8
Thread #9
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用std::cout和做同样的事情时std::endl,我得到了这个:
Thread #0
Thread #Thread #2
Thread #3
Thread #9
1
Thread #8
Thread #4
Thread #5
Thread #7
Thread #6
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况std::cout而不是发生printf?
你没有显示你的std :: cout代码.
threads.push_back(std::thread([i](){ printf("Thread #%d\n", i); }));
Run Code Online (Sandbox Code Playgroud)
但是如果我假设您将代码更改为:
threads.push_back(std::thread([i](){ std::cout << "Thread #" << i << std::endl; }));
Run Code Online (Sandbox Code Playgroud)
这两者有很大的不同:
该printf版本只有一个打印库的调用:
printf("Thread #%d\n", i);
Run Code Online (Sandbox Code Playgroud)
将operator<<有三个不同的调用印刷库
operator<<(std::cout, "Thread #");
operator<<(std::cout, i);
operator<<(std::cout, std::endl);
// note for the pedantic the use of functions here is for illustration purposes.
Run Code Online (Sandbox Code Playgroud)
假设打印库在内部具有某种锁定,则printf版本将为每个线程提供一行.虽然operator<<版本可能会在通话之间被抢占.
即使有内部锁,我也不打赌任何版本.打印部分可能只是足够短,以至于观察中断的可能性很小,因此您可能还没有观察到它.
尝试:
threads.push_back(std::thread([i]()
{ std::stringstream msg;
msg << "Thread #" << i << "\n";
std::cout << msg.rdbuf();
}));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |