我在Linux上使用C语言进行了大量的工作,现在我正在尝试使用Windows上的c ++,但我在打印到标准输出时遇到了麻烦。在线程执行的函数中我有:
void print_number(void* x){
int num = *(static_cast<int*> (x));
std::cout << "The number is " << num << std::endl;
}
包装在一个创建三个线程的循环中。问题是虽然所有内容都被打印出来,但线程似乎在每个“&lt;&lt;”之间互相中断。
例如,我上次运行它时我得到了
The number is The number is 2The number is 3
1
当我希望每个人都在另一条线上时。我猜测每个线程能够在另一个线程在“&lt;&lt;”之间写入一个部分之后写入标准输出。在C中,这不是一个问题,因为缓冲区没有刷新,直到我需要写入的所有内容都存在,但现在情况并非如此,我不认为。这是需要互斥的情况吗?
答案 0 :(得分:2)
在C ++中,我们首先更愿意将参数作为int*
。然后,我们可以锁定。在C ++ 11中:
std::mutex mtx; // somewhere, in case you have other print functions
// that you want to control
void print_number(int* num) {
std::unique_lock<std::mutex> lk{mtx}; // RAII. Unlocks when lk goes out of scope
std::cout << "The number is " << *num << std::endl;
}
如果不是C ++ 11,那么boost::mutex
和boost::mutex::scoped_lock
的工作方式相同并做同样的事情。
答案 1 :(得分:1)