簡體   English   中英

線程構建塊會在fork上克隆線程

[英]Threading Building Blocks clones threads on fork

為了啟動另一個程序,我在代碼中使用了fork()和exec()。 由於我的程序使用線程構建基塊庫進行任務管理,因此它之前使用線程池初始化了調度程序。

每當我進行分叉時,似乎所有線程也都被分叉了(檢查頂部的線程數)。 根據我在Internet上閱讀的內容,僅應分叉當前線程。

我如何實現此行為,並且線程構建塊是否導致多個線程分叉?

我相信互聯網在這方面是正確的,即在fork之后,一個新創建的進程只有一個線程,一個稱為fork的線程。 多線程程序中fork的問題是其他(不執行fork)線程的狀態完整性,即,如果在fork期間獲取了鎖,則無論新舊進程都必須取消鎖定。 TBB對此有一些支持,但是我不確定這是否是您所需要的,因為在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()的這個特殊參數,就不能保證終止工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM