繁体   English   中英

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

[英]How do I print in a new thread without threads interrupting lines? (particularly c++)

我已经在Linux上的C语言中进行了大量的工作,现在我正在尝试执行相同的操作,但是在Windows上使用c ++,但是在打印到标准输出时遇到了麻烦。 在函数执行线程中我有:

void print_number(void* x){
    int num = *(static_cast<int*> (x));
    std::cout << "The number is " << num << std::endl;
}

包裹在创建三个线程的循环中。 问题是,尽管所有内容都已打印,但线程似乎在每个“ <<”之间相互中断。

例如,上次我运行它时

The number is The number is 2The number is 3
1

当我希望每个人都分开一行时。 我猜每个线程都可以在另一个在“ <<”之间写入单个部分之后写入标准输出。 在C语言中,这不是问题,因为直到我需要的所有写操作都在那里时才刷新缓冲区,但是现在我不这么认为。 是否需要互斥锁?

在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 ,它们的工作方式相同,执行相同的操作。

您的C示例是偶然工作的; printf之类不是原子要么

互斥量确实是这种情况。 我通常在本地为它分配静态函数。 例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM