如何在没有线程中断线路的情况下在新线程中打印? (特别是c ++)

时间:2014-12-11 03:57:20

标签: c++ multithreading

我在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中,这不是一个问题,因为缓冲区没有刷新,直到我需要写入的所有内容都存在,但现在情况并非如此,我不认为。这是需要互斥的情况吗?

2 个答案:

答案 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::mutexboost::mutex::scoped_lock的工作方式相同并做同样的事情。

答案 1 :(得分:1)

您的C示例偶然起作用; printf之类的aren't原子either

这确实是互斥锁的情况。我通常在本地分配静态函数。 E.g:

void atomic_print(/*args*/) {
    static MyMutex mutex;
    mutex.acquire();
    printf(/*with the args*/);
    mutex.release();
}