Concurrency 固定线程不安全功能

Concurrency 固定线程不安全功能,concurrency,Concurrency,我的教科书《计算机系统:程序员的视角》给出了以下线程不安全函数的示例: unsigned int next = 1; int rand () { next = next * W + X; return (unsigned int)(next/Y) % Z; } void srand (unsigned int seed) { next = seed; } 书中说,修复此函数的唯一方法是重写它,使其可重入。我很难理解为什么不能使用互斥锁将写入同步到下一个。我可以理解为

我的教科书《计算机系统:程序员的视角》给出了以下线程不安全函数的示例:

unsigned int next = 1;

int rand () {
    next = next * W + X;
    return (unsigned int)(next/Y) % Z;
}

void srand (unsigned int seed) {
    next = seed;
}

书中说,修复此函数的唯一方法是重写它,使其可重入。我很难理解为什么不能使用互斥锁将写入同步到下一个。我可以理解为什么如果你有很多线程,这将是不可取的。但就正确性而言,我仍然认为这不应该起作用吗?

您的修复可能不是最好的方法。例如,一个线程可能在读取
next
之后但在写入它之前被切换出去,而另一个线程可能被切换进来并多次调用该函数,在伪随机序列中进行多次迭代。然后,当第一个线程被切换回时,它会将其现在过时的值写入
next
,从第二个线程的角度“备份”伪随机序列

现在,如果出于您的目的,这种行为是可以接受的,那么简单地用互斥来保护
next
的写入就可以了——但在这种情况下,它也符合“使函数可重入”的定义