以任意顺序连接多个线程
Joining multiple threads in any order
我有一个std::thread
对象数组,它们的操作顺序和重新加入主线程的顺序都无关紧要。我试过使用
for(int i = 0; i < noThreads; ++i)
{
if(threads[i].joinable())
threads[i].join();
}
但似乎让它们"按顺序"运行,当然,这可能是我从线程的控制台输出按照我调度它们的顺序(就像线程#1的所有输出,然后是线程#2的所有输出)得出的结论。我也尝试过threads[i].detach()
,但我不知道每个线程的执行时间,所以我不能暂停程序,直到它们完成。
每个线程正在做的工作是:
int spawn(const char* cmd)
{
FILE *fp = popen(cmd, "r");
char buff[512];
if(vFlag == 1)
{
while(fgets(buff, sizeof(buff), fp)!= NULL)
{
printf("%s", buff);
}
}
int w = pclose(fp);
if(WIFEXITED(w))
return WEXITSTATUS(w);
else
return -1;
}
其中正在执行的命令是CCD_ 3。考虑到当前打印到控制台的事实将变为输出到各种文件,我如何调度线程,以便使它们执行,然后无序重新加入?
执行顺序不受联接顺序的影响。因此,您可以简单地在循环中调用join
来连接所有线程。
第二件值得指出的事情是,joinable
并不意味着线程是否已经完成执行。有关详细说明,请参阅链接。
如果您真的想检查线程是否已经完成执行,那么可能还有其他方法可以做到这一点,如下所述。
Boost已经有了一些扩展,可以等待一组未来和测试函数中的任何一个或全部,以查看线程是否已经完成执行。
您正在使用的for循环为您提供连接顺序(而不是线程执行顺序)。
我的意思是,join
函数正在阻止进程等待线程完成,因此,如果您使用正在使用的for循环检查线程,那么即使(即)最后一个线程已经完成,您也会在第一个联接上阻止主进程。
正如你所看到的,也就是在这里,joinable
方法的意思是:这个线程是否已经启动(或者可能已经完成),并且还没有加入?
因此,如果你需要知道一个线程是否完成了,我认为你可以使用类似于链接到每个线程的信号量的东西,并在一个循环中检查它的值。因此,您将不会阻塞主进程,并且您将几乎按照线程的完成顺序连接线程。
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 如果两个线程相互依赖,则 cpp 线程连接应使用连接导致死锁
- 视频在唤醒其他线程时输入设备断开连接
- 正在连接的等待条件变量的线程会发生什么情况?
- 如何强制线程轮流连接到字符串?
- 将信号从工作线程类连接到控制器类 - QThreads
- 多个网络连接的线程与异步 I/O
- 什么时候标准::线程::连接会因no_such_process而失败
- C++线程的向量在连接时随机崩溃
- C++线程连接会立即返回或不返回
- 如何将信号从线程连接到插槽
- 线程连接在另一个线程运行时会导致分段错误
- 线程连接问题
- Qt中的C++线程连接
- 线程连接函数阻塞调用线程
- Qt:多线程连接不工作
- 线程连接是如何工作的
- 在已完成的std::线程连接上发生死锁
- 线程连接c++行为