Это не требуется , но довольно удобно. Некоторые функции, такие как rand
и strtok
, используют статическую информацию о продолжительности хранения, которая может быть проблематичной при совместном использовании между потоками.
Скажем, у вас есть функция случайных чисел, в которой вы хотите поддерживать различную последовательность (следовательно, начальное число) для каждого потока. У вас есть два подхода.
Вы можете использовать что-то вроде kludgy:
int seed;
srand (&seed, time (NULL));
int r = rand_r (void *seed);
где семя должно быть создано вызывающим и передано в каждый раз.
Или вы можете использовать более приятный, соответствующий ISO:
srand (time (NULL));
int r = rand();
, который использует локальное хранилище для поддержки потока, специфичного для потока. Аналогично информации, используемой strtok
относительно местоположений в строке, которую она обрабатывает.
Таким образом, вам не придётся возиться с изменением кода между версиями с нитями и без потоков.
Теперь вы могли бы создать эту информацию в функции потока, но как функция rand
узнает об ее адресе без его передачи. А что если rand
называется 87 уровней стека вниз? Это очень много уровней для передачи указателя.
И даже если вы делаете что-то вроде:
void pthread_fn (void *unused) {
int seed;
rand_set_seed_location (&seed);
:
}
и rand
впоследствии используют это значение независимо от того, насколько глубоко оно находится в стеке, это все равно изменение кода по сравнению со стандартом. Это может работать, но также может писать операционную систему на языке COBOL. Это не делает его хорошей идеей: -)