Ну, функция rand_r должна быть функцией, защищенной потоком. Однако, по его реализации, я не могу поверить, что он может не измениться другими потоками. Предположим, что два потока вызовут rand_r в одно и то же время с одним и тем же переменным семенем. Так начнется гонка чтения-записи. Код rand_r, реализованный glibc, приведен ниже. Кто-нибудь знает, почему rand_r называется потокобезопасным?Действительно ли rand_r является реальной потокобезопасной?
int
rand_r (unsigned int *seed)
{
unsigned int next = *seed;
int result;
next *= 1103515245;
next += 12345;
result = (unsigned int) (next/65536) % 2048;
next *= 1103515245;
next += 12345;
result <<= 10;
result ^= (unsigned int) (next/65536) % 1024;
next *= 1103515245;
next += 12345;
result <<= 10;
result ^= (unsigned int) (next/65536) % 1024;
*seed = next;
return result;
}