Threading Building Blocks 在 fork 上克隆线程

Threading Building Blocks clones threads on fork

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

每当我进行分叉时,似乎所有线程都被分叉了(用 top 检查线程数)。根据我在 Internet 上阅读的内容,只有当前线程应该被分叉。

如何实现此行为,线程构建块是否会导致多线程分叉?

我相信网上在这方面是正确的,即在 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() 没有这个特殊参数,则无法保证工人终止。