一般来说,我假设流不同步,由用户做适当的锁定.但是,做cout标准库中的特殊处理吗?
也就是说,如果多个线程正在写入,cout它们会破坏cout对象吗?据我所知,即使同步,你仍然会得到随机交错的输出,但保证交错.也就是说,cout从多个线程使用是否安全?
该供应商是否依赖?gcc做什么?
重要提示:如果您说"是",请为您的答案提供某种参考,因为我需要某种证明.
我关注的还不是基础系统调用,这些都很好,但是流在顶部添加了一层缓冲.
在多个线程中使用cout可能会导致交错输出.
所以我试图用互斥锁来保护cout.
以下代码使用std :: async启动10个后台线程.线程启动时,会打印"Started thread ...".主线程按照创建顺序迭代后台线程的未来,并在相应的线程完成时打印出"Done thread ...".
输出正确同步,但在某些线程启动后有些线程已经完成(参见下面的输出),就会出现死锁.剩下所有后台线程,主线程正在等待互斥锁.
僵局的原因是什么?
当保留打印功能或for循环的一次迭代结束时,lock_guard应解锁互斥锁,以便其中一个等待线程能够继续.
为什么所有线程都挨饿?
码
#include <future>
#include <iostream>
#include <vector>
using namespace std;
std::mutex mtx; // mutex for critical section
int print_start(int i) {
lock_guard<mutex> g(mtx);
cout << "Started thread" << i << "(" << this_thread::get_id() << ") " << endl;
return i;
}
int main() {
vector<future<int>> futures;
for (int i = 0; i < 10; ++i) {
futures.push_back(async(print_start, i));
}
//retrieve and print the value stored in the …Run Code Online (Sandbox Code Playgroud) 我知道在C++ 98中严格说来没有什么是线程安全的,因为在标准中,在C++ 11之前没有线程.但是,在实践中,早在C++ 11之前就已经在C++中使用了线程.
所以让我们两个pthreads同时称之为:
void printSomething(){
std::cout << "something\n";
}
Run Code Online (Sandbox Code Playgroud)
什么可以导致两个输出交错?或者我会在实践中总是两行包含"某些东西"吗?
...在C++ 11中,std :: cout是线程安全的.
但这个答案提供了一个例子
std::cout << "aaaaaaaaaa" << "bbbbbbbbbb";
Run Code Online (Sandbox Code Playgroud)
并得出结论,在C++ 98中,执行此操作的两个线程可能具有交错输出,但我找不到任何关于两个线程operator<<只调用一次的内容.