【发布时间】:2018-06-04 12:21:15
【问题描述】:
我正在尝试控制模拟中的输出打印。它打印了很多输出流信息。这是我如何尝试控制输出流的示例代码。有时我想为每个线程打印信息,有时我不想从线程中单独打印以减少模拟中的系统调用。我通过命令行参数来控制流。参数v 表示没有打印。问题是它在整个模拟器中需要很多 if 语句。有什么简单的方法可以解决这个问题吗?
#include <iostream>
#include <thread>
void work_to_do_1(char ch)
{
//work for thread 1
if(ch != 'v')
std::cout << "-:Thread 1:-" << std::endl;
}
void work_to_do_2(char ch)
{
if (ch != 'v')
std::cout << "-:Thread 2:-" << std::endl;
}
void work_to_do_3(char ch)
{
if (ch != 'v')
std::cout << "-:Thread 3:-" << std::endl;
}
int main(int argc, char *arg[])
{
std::cout << "You have entered " << argc
<< " arguments:" << "\n";
for (int i = 0; i < argc; ++i)
{
std::cout << arg[i] << "\n";
}
char t = *arg[1];
std::cout << "manager is running" << std::endl;
std::thread t1(work_to_do_1, t);
std::thread t2(work_to_do_2, t);
std::thread t3(work_to_do_3, t);
t1.join();
t2.join();
t3.join();
system("pause");
return 0;
}
【问题讨论】:
-
为什么是
!(ch == 'v')而不是更常见(和平等)的ch != 'v'? -
只需使用
my_cout << "whatever";,其中my_cout包含std::cout和条件。无论如何,在代码中的任何地方都明确显示std::cout并不是最好的事情 -
Here's an old answer 关于如何创建“空”流。如果不应该输出任何内容,则传递一个“null”流,或者如果你想要输出,则传递一个标准的
std::cout。 -
还要注意
std::coutafaik 不是线程安全的 -
旁注:afaik 你应该在线程完成执行之前加入或分离线程,因为既不加入也不分离线程的析构函数会导致 ub。
标签: c++ multithreading