线程构建块在叉上克隆线程

时间:2015-07-24 23:17:45

标签: c++ multithreading unix fork tbb

为了启动另一个程序,我在代码中使用了fork()和exec()。 由于我的程序使用Threading Building Blocks库进行任务管理,因此它在之前使用线程池初始化调度程序。

每当我做一个fork时,似乎所有的线程都被分叉(检查顶部的线程数)。从我在互联网上阅读的内容来看,只应分叉当前的主题。

如何实现此行为并且是线程构建块导致多线程的分支?

1 个答案:

答案 0 :(得分:3)

我认为互联网在这方面是正确的,即在fork之后,新创建的进程只有一个线程,一个调用fork。多线程程序中fork的问题是其他(不执行fork)线程的状态完整性,即如果在fork期间执行锁定,则必须在新旧两个进程中将其取消。 TBB有一些支持来处理它,但我不确定这是你需要的,因为在fork之后的exec正在替换所有内存,所以采取锁定必须不是问题。

如果你在fork和exec之间做了一些特别的事情(比如,可能被TBB工作人员锁定),那么TBB的第一个障碍就是工人的状态。 TBB允许您等到工作人员终止(请注意这是预览功能)。

#define TBB_PREVIEW_WAITING_FOR_WORKERS 1
#include "tbb/task_scheduler_init.h"
{
    tbb::task_scheduler_init sch(threads, 0, /*wait_workers=*/true);
    tbb::parallel_for(…);
} // wait workers here, no worker threads after this point

如果没有task_scheduler_init()的特殊参数,则无法保证工人终止。