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

Threading Building Blocks clones threads on fork

本文关键字:线程 构建 fork      更新时间:2023-10-16

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

每当我执行fork时,似乎所有的线程都被分叉了(用top检查线程数)。根据我在网上看到的,只有当前线程应该被分叉。

我如何实现这种行为,线程构建块导致多个线程的分叉?

我相信互联网在这方面是正确的,即在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()没有这个特殊的参数,就不能保证worker的终止。