修复线程不安全的功能

时间:2015-05-23 17:52:09

标签: concurrency

我的教科书,计算机系统:程序员的观点,给出以下作为线程不安全函数的示例:

unsigned int next = 1;

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

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

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

1 个答案:

答案 0 :(得分:0)

您的修复可能不是最好的做事方式。例如,一个线程可以在读取next之后但在写入之前被切换出来,并且第二个线程可以被接入并多次调用该函数,通过多次迭代推进伪随机序列。然后,当第一个线程重新打开时,它会将其现在过时的值写入next,然后“备份”。从第二个线程的角度看伪随机序列。

现在,如果这种行为对于您的目的是可接受的,那么仅使用互斥锁保护next的写入就可以了 - 但在这种情况下,它也符合“制作”的定义功能可重入'。