Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程上下文中的环境变量_C++_Multithreading_Unix - Fatal编程技术网

C++ 线程上下文中的环境变量

C++ 线程上下文中的环境变量,c++,multithreading,unix,C++,Multithreading,Unix,我有一个程序,我们称之为scheduler,它在for循环中使用openmp生成2个线程。大概是这样的: #pragma omp for num_threads(2) for (int i = 0; i < 2; ++i) { if (omp_get_thread() == 0) setenv("VAR", 0); else setenv("VAR", 1); system("./script.sh"); } 用于num_线程的p

我有一个程序,我们称之为scheduler,它在for循环中使用openmp生成2个线程。大概是这样的:

#pragma omp for num_threads(2)
for (int i = 0; i < 2; ++i) {
    if (omp_get_thread() == 0)
        setenv("VAR", 0);
    else
        setenv("VAR", 1);

    system("./script.sh");
}
用于num_线程的pragma omp(2) 对于(int i=0;i<2;++i){ if(omp_get_thread()==0) setenv(“VAR”,0); 其他的 setenv(“VAR”,1); 系统(“./script.sh”); }
脚本的执行将取决于该VAR值。如何使线程0中的VAR上下文与线程1中的VAR上下文不同,以便它们可以保留不同的值?

首先,除非有真正的原因,否则我会用shell或其他脚本语言编写调度程序。使用openmp是一种过度使用,拨叉控制操作符
&
应该可以正常工作

其次,每个shell都有自己的环境(子进程继承),因此我只需传递所需的
GOMP\u CPU\u BIND
(实际上,您可能指的是
GOMP\u CPU\u AFFINITY
,因为前者似乎没有任何文档记录?)作为
script.sh
的命令行参数,然后将
script.sh
中的
GOMP\u CPU\u AFFINITY
导出相应的值

总之,你可以写下这样的话:

scheduler.sh:

 #!/bin/sh
 ./script.sh 1 &
 ./script.sh 2 &
#!/bin/sh
export GOMP_CPU_AFFINITY=$1
./myprog
script.sh:

 #!/bin/sh
 ./script.sh 1 &
 ./script.sh 2 &
#!/bin/sh
export GOMP_CPU_AFFINITY=$1
./myprog

这个用例是什么,您希望使用对这两个线程都是全局的环境变量。为什么不为每个线程设置一个全局变量,或者设置一个局部变量并使其影响环境变量值。如果设置
VAR
的目的是修改script.sh的行为,那么为什么不将
VAR
作为常规命令行参数传递呢?我简化了问题。每个脚本调用将执行一个也使用openmp的应用程序。我想为每个应用程序分别定义GOMP_CPU_BIND变量,因为我知道没有一种方法可以通过硬编码来实现这一点,而这实际上不能通过您尝试的方式来实现。在本例中,两个线程运行的环境是相同的可执行文件,因此它们将具有相同的环境。正如smani所说,最好将参数传递到脚本中……或者使用更智能的流程启动器。环境变量与流程关联,而不是与线程(一个流程可以有多个线程)关联。如果您必须使用环境变量,那么您可能需要类似于
系统(“bash-c\”VAR=1;/script.sh\”)
。。。否则,在单独的线程中使用
setenv()
会变得很快或更糟。。。