c – 在多个线程中使用std :: cout
作者:互联网
我在c 11编写了一个简单的程序来测试Thread,但是std :: cout并没有像我期望的那样工作.
class Printer
{
public:
void exec()
{
mutex m;
m.lock();
cout<<"Hello "<<this_thread::get_id()<<endl;
chrono::milliseconds duration( 100 );
this_thread::sleep_for( duration );
m.unlock();
}
};
int main()
{
Printer printer;
thread firstThread([&printer](){
while(1)
printer.exec();
});
thread secondThread([&printer](){
while(1)
printer.exec();
});
firstThread.join();
secondThread.join();
}
一些结果:
Hello 11376
Hello 16076
Hello 16076
Hello Hello 11376
16076
Hello 11376
,....
我使用互斥锁来锁定线程,所以我无法理解为什么两个线程同时执行std :: cout.
它接缝非常适合我.任何人都可以解释发生了什么!?!
解决方法:
线程使用不同的互斥锁实例,因为互斥锁是exec()函数中的局部变量,因此锁定互斥锁是没有意义的,因为每个线程将锁定其自己的互斥锁,导致线程之间没有同步.线程必须使用相同的互斥锁实例才能实现同步.
要更正已发布的代码,请将互斥锁变为成员变量.但是,如果创建了另一个Printer对象,则使用不同Printer实例的线程之间将不会同步.在这种情况下,互斥锁需要是一个静态成员变量才能确保同步:
class Printer
{
public:
//...
private:
static std::mutex mtx_;
};
std::mutex Printer::mtx_;
要确保始终释放互斥锁,无论函数是正常退出还是通过异常退出,请使用std:lock_guard
:
std::lock_guard<std::mutex> lock(m); // 'm' locked, and will be
// unlocked when 'lock' is destroyed.
std::cout<< "Hello " << std::this_thread::get_id() << std::endl;
std::chrono::milliseconds duration( 100 );
std::this_thread::sleep_for( duration );
标签:stdthread,c,c11,multithreading,mutex 来源: https://codeday.me/bug/20191004/1853932.html