我的教科书,计算机系统:程序员的观点,给出以下作为线程不安全函数的示例:
unsigned int next = 1;
int rand () {
next = next * W + X;
return (unsigned int)(next/Y) % Z;
}
void srand (unsigned int seed) {
next = seed;
}
该书说,修复此功能的唯一方法是重写它,以便它可以重入。我很难理解为什么你不能使用互斥锁将写入同步到下一个。我明白为什么如果你有很多线程,这是不可取的。但是,就正确性而言,我仍然不应该这样做吗?
答案 0 :(得分:0)
您的修复可能不是最好的做事方式。例如,一个线程可以在读取next
之后但在写入之前被切换出来,并且第二个线程可以被接入并多次调用该函数,通过多次迭代推进伪随机序列。然后,当第一个线程重新打开时,它会将其现在过时的值写入next
,然后“备份”。从第二个线程的角度看伪随机序列。
现在,如果这种行为对于您的目的是可接受的,那么仅使用互斥锁保护next
的写入就可以了 - 但在这种情况下,它也符合“制作”的定义功能可重入'。