2013-10-04 2 views
0

Есть ли способ заставить потоки иметь независимые адресные пространства? Я бы хотел, чтобы многие потоки выполняли циклы с использованием локальных переменных, но, похоже, все они имеют одни и те же переменные.PThreads Адресное пространство

, например

for (i = args->start; i < args->end; i++) { 
     printf("%d\n", i); 
     if (quickFind(getReverse(array[i]), 0, size - 1)) { 
      printf("%s\n", array[i]); 
      //strcpy(array[i], ""); 
     } 
    } 

i, кажется, общими для всех потоков.

+4

не используют глобальные или статические переменные и не пропускают указатели между потоками, и у вас не должно быть слишком много проблем. Единственное, что нужно помнить, - это функции библиотеки, которые используют глобальные переменные или статические varaibles ..... – goji

+4

Кроме того, ваш пример на самом деле не показывает, где находится общая память, где объявляются эти переменные? – goji

+0

вы имеете в виду, как 'fork()'? ... вы все равно можете использовать общую память, семафоры, ... – technosaurus

ответ

0

Темы разделяют пространство памяти их родительского процесса. Его характер. Если вы этого не хотите, вы можете создать новый процесс, который будет иметь собственное адресное пространство, используя fork().

Если вы решили использовать fork(), помните, что при успешном создании дочернего процесса он возвращает 0 дочернему процессу и PID дочернего процесса в родительский процесс.

0

Короткий ответ: Да, каждый поток может иметь свою собственную копию переменной i.

Длинный ответ:

Все потоки совместно используют один и тот же адресное пространство и операционная система не обеспечивает никакой защиты, чтобы предотвратить один поток от доступа к памяти, используемой другим. Однако память может быть разделена так, что к ней будет доступен только один поток, а не общий доступ для всех потоков.

По умолчанию каждый поток получает свой собственный стек. Поэтому, если вы выделяете переменную в стеке, к ней обычно будет доступен только один поток. Обратите внимание, что можно передать указатель на переменную стека из одного потока в другой, но это не рекомендуется и может быть источником тех проблем, которые вы видите.

Другим способом получения потока собственной копией переменной является использование локального хранилища потоков. Это позволяет каждому потоку иметь собственную копию глобальной переменной.

Таким образом, хотя потоки разделяют адресное пространство, они могут работать с частными данными. Но вам нужно быть осторожным с тем, как вы делитесь данными между потоками и избегаете гонок данных.

0

Просто используйте каждый поток в функции отдельно. Каждый вызов функции получает свои собственные экземпляры всех локальных переменных. Если это не так, рекурсия не будет работать.

0

Если вы хотите быть действительно ленивым и не изменять какие-либо изменения дизайна (не рекомендуется), вы можете изменить объявление i на что-то вроде __thread int i, чтобы каждый поток имел свой собственный экземпляр этой переменной.

Если вы использовали OpenMP вместо потоков Posix, вы также можете сказать #pragma omp threadprivate(i) перед первым использованием i.

Смежные вопросы