gpt4 book ai didi

c++ - 从 C++ 库中设置环境变量

转载 作者:行者123 更新时间:2023-11-30 04:45:16 32 4
gpt4 key购买 nike

所以基本上我试图在我的 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 版本(其他操作系统实现可能相同):

The string pointed to by [the parameter to putenv()] becomes part of the environment, so altering the string changes the environment.

那是你的大喇叭警钟:你最好不要再想碰这根绳子,即使是用一根 10 英尺长的杆子,因为它现在是环境的一部分。

在您的共享库版本中:

char ompEnv[]="OMP_NUM_THREADS=1";

这个数组是函数中的局部变量。因此,此函数返回时,此数组将被销毁。但是这个数组也作为参数传递给 putenv()。总计:此函数返回后,您的环境变量之一现在是悬空指针。

没有足够的信息最终证明您的“主要功能”版本也是未定义行为,但也很有可能。

关于c++ - 从 C++ 库中设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57351676/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com