首页 > 解决方案 > 作为随机数生成器的竞争条件

问题描述

我在运行它时通过“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);
}

标签: c++race-condition

解决方案


我可以将它用作随机数生成器吗?

您真的不应该将其用作随机数。

为什么?

你不应该因为竞争条件是未定义的行为。

这个“随机”数字没有很好的熵,因为它取决于时间。

有更好的方法来生成随机数#include <random>


推荐阅读