У меня есть программа, позволяющая называть ее планировщиком, которая порождает 2 потока, используя openmp в цикле for. Что-то вроде этого:
#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");
}
Выполнение скрипта будет зависеть от этого значения VAR. Как я могу сделать контекст VAR в потоке 0 отличным от потока 1, чтобы они могли хранить разные значения?
Во-первых, если нет реальных причин, я бы написал планировщик в оболочке или другом языке сценариев. Использование openmp - это избыток, оператор управления fork &
должен работать нормально.
Во-вторых, каждая оболочка имеет свою собственную среду (которая наследует дочерние процессы), поэтому я просто GOMP_CPU_BIND
желаемое значение GOMP_CPU_BIND
(на самом деле, вы, вероятно, имеете в виду GOMP_CPU_AFFINITY
поскольку первая не отображается нигде в документе?) В качестве аргумента командной строки к script.sh
а затем экспортируйте GOMP_CPU_AFFINITY
в script.sh
с соответствующим значением.
Поэтому, чтобы подвести итог, вы должны написать что-то вроде:
scheduler.sh:
#!/bin/sh
./script.sh 1 &
./script.sh 2 &
script.sh:
#!/bin/sh
export GOMP_CPU_AFFINITY=$1
./myprog
VAR
состоит в том, чтобы изменить поведение script.sh, то почему бы вам просто не передатьVAR
в качестве обычного аргумента командной строки?