簡體   English   中英

從庫 C++ 中設置環境變量

[英]Setting environment variable from within library C++

所以基本上我試圖在我的 C++ 代碼中設置一個環境變量來強制線程數為 1。我正在使用多個機器學習庫,默認情況下使用OpenMP並且可以通過設置以下內容強制在單線程模式下運行環境變量: OMP_NUM_THREADS=1

這是我的問題。 我想從我正在構建的庫中設置這個環境變量。

當我從我的主函數(針對我正在構建的庫的可執行鏈接)設置環境變量時,它會按預期工作(在程序執行期間僅使用 1 個線程):

    auto implPtr = FRVT_11::Interface::getImplementation();
    implPtr->initialize(CONFIG_DIR);
    char ompEnv[]="OMP_NUM_THREADS=1";
    putenv( ompEnv );
    // More code

但是,如果我嘗試從我正在構建的庫中設置環境變量(例如從getImplementation函數中),則使用的線程數是 4 而不是 1:

// This does not work
std::shared_ptr<FRVT_11::Interface> FRVT_11::Interface::getImplementation() {
    char ompEnv[]="OMP_NUM_THREADS=1";
    putenv( ompEnv );
    return std::make_shared<MyImplementation>();
}

任何想法為什么會這樣? 我正在構建和運送庫,所以我需要從庫中設置線程數。

您的“庫函數”版本是未定義的行為。

你的“主函數”版本也可能是未定義的行為,作為額外的獎勵,但你還沒有意識到這一點。

來自putenv(3)手冊頁的 Linux 版本(其他操作系統實現可能相同):

[putenv() 的參數] 指向的字符串成為環境的一部分,因此更改字符串會更改環境。

那是你的大喇叭,警鍾:你最好不要再想碰這根弦,即使是用一根 10 英尺長的桿子,因為它現在是環境的一部分。

在您的共享庫版本中:

char ompEnv[]="OMP_NUM_THREADS=1";

該數組是函數中的局部變量。 因此,當此函數返回時,此數組將被銷毀。 但是這個數組也作為參數傳遞給putenv() 總計:一旦此函數返回,您的環境變量之一現在就是一個懸空指針。

沒有足夠的信息來最終證明您的“主函數”版本也是未定義的行為,但它也很有可能。

暫無
暫無

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

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