Переменная среды в контексте потока

0

У меня есть программа, позволяющая называть ее планировщиком, которая порождает 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, чтобы они могли хранить разные значения?

  • 0
    Каков вариант использования для этого, вы хотите использовать переменные среды, которые будут глобальными для обоих этих потоков. Почему бы не установить глобальную переменную для каждого потока, или установить локальную переменную и повлиять на значение переменной среды.
  • 0
    Если цель установки VAR состоит в том, чтобы изменить поведение script.sh, то почему бы вам просто не передать VAR в качестве обычного аргумента командной строки?
Показать ещё 3 комментария
Теги:
multithreading

1 ответ

0
Лучший ответ

Во-первых, если нет реальных причин, я бы написал планировщик в оболочке или другом языке сценариев. Использование 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню