【问题标题】:Threading Building Blocks clones threads on forkThreading Building Blocks 在 fork 上克隆线程
【发布时间】:2015-07-24 23:17:45
【问题描述】:

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

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

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

【问题讨论】:

  • 你说得对,fork(2) 只克隆当前线程。我猜这是 TBB 的一些功能,但我不熟悉它。关于分叉,我能找到的只是这个页面:adeptscience.co.uk/products/cpp/intel-threading-building-blocks - 它说 通过用户启用的 API 实现分叉安全,确保英特尔® TBB 工作线程在执行分叉之前完成。 也许您应该使用这个分叉 API?库可能需要在分叉之前进行一些清理/内务处理(很可能)。

标签: c++ multithreading unix fork tbb


【解决方案1】:

我相信互联网在这方面是正确的,即在 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 会终止。

【讨论】:

  • 既然你说互联网是正确的,那就意味着应该退出线程并且你的答案是正确的。除了等待工人很有趣,可能是问题,但不幸的是我不能再重现它了。
猜你喜欢
  • 2023-03-15
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多