相关疑难解决方法(0)

cout同步/线程安全吗?

一般来说,我假设流不同步,由用户做适当的锁定.但是,做cout标准库中的特殊处理吗?

也就是说,如果多个线程正在写入,cout它们会破坏cout对象吗?据我所知,即使同步,你仍然会得到随机交错的输出,但保证交错.也就是说,cout从多个线程使用是否安全?

该供应商是否依赖?gcc做什么?


重要提示:如果您说"是",请为您的答案提供某种参考,因为我需要某种证明.

我关注的还不是基础系统调用,这些都很好,但是流在顶部添加了一层缓冲.

c++ gcc c++11

108
推荐指数
4
解决办法
4万
查看次数

死锁使用std :: mutex来保护多线程中的cout

在多个线程中使用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++ concurrency multithreading mutex deadlock

12
推荐指数
2
解决办法
1087
查看次数

在C++ 98中写一个单独的字符串来cout"线程安全"

我知道在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<<只调用一次的内容.

c++ multithreading c++98

3
推荐指数
1
解决办法
374
查看次数

标签 统计

c++ ×3

multithreading ×2

c++11 ×1

c++98 ×1

concurrency ×1

deadlock ×1

gcc ×1

mutex ×1