线程构建块在fork上克隆线程
Threading Building Blocks clones threads on fork
对于启动另一个程序,我在代码中使用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的终止。
相关文章:
- 使用 task_group 的英特尔线程构建模块性能不佳(新用户)
- 什么是运行英特尔线程构建模块的 XCode 8 环境变量
- 使用英特尔线程构建块编译:错误操作数为?:
- 构建线程的幕后花絮
- 使用C 构建器在窗户上拍摄屏幕截图的线程安全
- 构建和同步多线程游戏循环
- 支持多线程方法来构建数组中所有元素的集合吗
- 从命令行构建x64 C++项目说:此操作应该只在UI线程上进行
- 使用boost线程1.51的程序没有't构建
- 线程池与英特尔线程构建模块一起使用
- 有没有办法控制英特尔线程构建模块中的线程数量、亲和力和创建时间
- 英特尔线程构建模块替代方案和许可
- 线程构建块流图 — 制作"counting"节点
- 线程构建块parallel_sort
- 使用Intel线程构建块(TBB)的Parallel_Scan组件无法实现加速
- 线程构建块在fork上克隆线程
- 微软TPL(任务并行库)vs英特尔TBB(线程构建块)
- 线程构建块(TBB)' ' enqueue ' ' ' '任务生存期
- 线程构建块(TBB)使用lambda为任务排队
- 使用gcc在Linux上运行线程构建块(Intel TBB)