die*_*ini 7 c++ concurrency multithreading
我想用一个例子说明我的问题.
假设有一个N /*(N>>1)*/线程数组被设置为运行此函数:
void Process() {
//Some thread safe processing which requires in-deterministic computation time
unsigned char byte;
std::cin >> byte;
}
Run Code Online (Sandbox Code Playgroud)
一旦所有这些都同时启动,会发生什么?如何处理并发std :: cin访问?在控制台上操作的最终用户可以看到/体验什么?
编辑:还有一件事我想补充一点.下面的代码是否安全到足以放弃在一个(可能是主要的)线程中使用std:cin的想法?
void Process() {
//Some thread safe processing which requires in-deterministic computation time
//Mutex lock
unsigned char byte;
std::cin >> byte;
//Mutex unlock
}
Run Code Online (Sandbox Code Playgroud)
预C++ 11,它取决于实现; 至少一个实现保证了呼叫的同步.(VC++保证同步std::cout,但不保证其他iostream对象的同步.g ++提供与C++ 11相同的保证,即使在早期版本的编译器中也是如此.)在C++ 11中,它是明确未定义的行为.
一般规则很简单:任何线程中对象状态的任何修改都需要同步所有访问.并且所有>>运营商std::istream都被视为修改其状态.
更一般地说,对于任何特定的流,仅在一个线程中使用它可能是一个好的策略.(有一些例外,例如日志记录流,其中日志记录对象确保线程安全.)输入尤其如此,因为即使在外部同步,如果操作符位于不同的线程中,通常也不会指定它们的顺序.因此,即使使用同步,如果您的用户输入"ab",哪个线程获得'a'以及'b'您的示例中的哪个将不确定.
似乎有成为标准的流对象(特殊规则std::cin,std::cout等等).保证并发访问不会产生数据竞争,至少在某些情况下是这样.它可能仍会导致字符混合,即:如果您正在输入int(而不是单个字符),并且您的用户输入"123 89\n",则线程1可能会看到
"1389\n",而线程2 "2 "则不会给您一致的结果.
我的全球推荐.我想不出任何现实的情况,其中字符的交错不会产生问题.(另外,我认为我从未编写过实际输入的代码std::cin;它总是来自
std::istream&可能是std::cin或者可能是文件的代码.)
第一个线程使用std :: cin锁定它(除非你use sync_with_stdio(false)).所以,你不需要互斥锁.
http://en.cppreference.com/w/cpp/io/cin
无论如何,我不建议在多线程应用程序中使用它.问题是无法从其他线程中断cin输入.