我在运行时用“pthread.h”模拟了C ++中线程之间的竞争条件,它在“随机”循环迭代中产生错误。
我可以将它用作随机数发生器吗?为什么?
#include<cstdio>
#include<thread>
static int counter = 0;
void increase() {
register int i = counter;
i++;
counter = i;
}
void decrease() {
register int i = counter;
i--;
counter = i;
}
int main() {
std::thread *p1, *p2;
register int i = 0;
while (1) {
i++;
counter = 0;
p1 = new std::thread(increase);
p2 = new std::thread(decrease);
p1->join();
p2->join();
delete p1;
delete p2;
if (counter) {
std::fprintf(stderr, "Error at loop %d\n", i);
std::exit(1);
}
}
std::exit(0);
}
我可以将它用作随机数发生器吗?
你真的不应该把它当作一个随机数。
为什么?
你不应该因为竞争条件是未定义的行为。
这个“随机”数字没有良好的熵,因为它取决于时间。
有更好的方法在#include <random>
中生成随机数。
未定义的行为不应该用作C ++代码中的熵的源(或其中一个源),即使它看起来是随机的。这是因为任何事情,如计算机或编译器设置的轻微变化或某些东西的升级或采取不同的计算机可能会导致更多随机的东西。