C++ 线程上下文中的环境变量
我有一个程序,我们称之为scheduler,它在for循环中使用openmp生成2个线程。大概是这样的: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
#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()
会变得很快或更糟。。。