gpt4 book ai didi

c++ - 多线程同步STD cout输出

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:32 24 4
gpt4 key购买 nike

最近我一直在使用多线程编码,写了一段时间后我意识到如果我在不同的 boost::threads 中使用 std::cout,输出将没有逻辑顺序,我的程序m 测试是这样的:

#include <boost/thread/thread.hpp>
#include <iostream>

int my01( void )
{
std::cout << "my01" << std::endl;
return 0;
}
/* my02, my03 and my04 are the same with different outputs*/
[...]
int main( void )
{
boost::thread t1(&my01);
boost::thread t2(&my02);
boost::thread t3(&my03);
boost::thread t4(&my04);

while(!t1.joinable() || !t2.joinable() || !t3.joinable() || !t4.joinable());

t1.join();
t2.join();
t3.join();
t4.join();

std::cout << "The end!" << std::endl;
getchar();
return 0;
}


输出通常是这样的(它会改变):

my02my01
my04
my03
BLANK LINE
The end!

考虑到这个问题,我正在考虑创建一个线程来管理所有输出,因此它们的顺序如下:

my01
my02
my03
my04
The end!

编写此类线程或管理这些输出的最佳方式是什么?
请也阅读此问题的答案:Is cout synchronized/thread-safe?

Ps:我使用的是 Visual C++ 2010 Express,我的 cpu 有 8 个不同的内核。

感谢您的宝贵时间!

最佳答案

首先,您可能会考虑避免所有显式线程管理,而是使用 std::async 在任意数量的独立线程中启动您的任务。

其次,您不想在线程本身中执行 I/O,而是希望创建结果并串行执行输出本身。这意味着线程函数只是创建一些数据,并将其留给调用者实际写出:

std::string process(int value) {
std::ostringstream buffer;
buffer << "my" << std::setfill('0') << std::setw(2) << value;
return buffer.str();
}

然后我们需要异步启动它的四个拷贝:

std::vector<std::future<std::string> > results;

for (int i=0; i<4; i++)
results.push_back(std::async(std::launch::async, process, i));

然后我们得到结果并按顺序打印出来:

for (auto &r : results)
std::cout << r.get() << "\n";

将它们放在一起,我们可以得到如下代码:

#include <string>
#include <iostream>
#include <thread>
#include <future>
#include <sstream>
#include <vector>
#include <iomanip>

std::string process(int value) {
std::ostringstream buffer;
buffer << "my" << std::setfill('0') << std::setw(2) << value;
return buffer.str();
}

int main() {
std::vector<std::future<std::string>> rets;

for (int i=0; i<4; i++)
rets.push_back(std::async(std::launch::async, process, i));

for (auto & t : rets) {
t.wait();
std::cout << t.get() << "\n";
}
}

我应该补充一点:我将其基于标准 C++11 future。我相信基本思想也应该适用于 Boost future(标准基于此),但我还没有测试过。我预计需要进行一些小的调整(例如,名称)才能与 Boost 的 future 一起工作。

关于c++ - 多线程同步STD cout输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9332263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com