作为随机数生成器的争用条件
Race-condition as a random number generator
我通过"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 %dn", i);
std::exit(1);
}
}
std::exit(0);
}
我可以将其用作随机数生成器吗?
你真的不应该把它作为一个随机数。
为什么?
您不应该这样做,因为争用条件是未定义的行为。
这个"随机"数字没有很好的熵,因为它取决于时间。
有更好的方法 在#include <random>
中生成随机数 .
未定义的行为不应用作C++代码中熵的来源(或来源之一(,即使它看起来是随机的。这是因为任何诸如计算机或编译器设置的微小更改或某些内容的升级或采用不同的计算机之类的事情都可能导致一些随机性要小得多的东西。
在计算中使用随机数生成器时,重要的属性之一是可复制的结果。此外,我们还希望有一个具有固定分布(通常是均匀分布(的可预测随机序列。
相关文章:
- 并行块(线程清理器)之外的 OpenMP 中的争用条件;误报?
- 如何在C++中创建争用条件
- C++上的手动重置事件(来自 C#)实现:如何避免争用条件
- 作为随机数生成器的争用条件
- 智能指针析构函数争用条件
- 尽管互斥锁,线程中的争用条件
- 在C++中递增和递减全局变量时的争用条件
- 为什么此代码不创建争用条件?
- __has_include() 和后续 #include 之间是否存在争用条件
- 什么保证两个不相关的线程中的不同不相关对象没有(不可避免的)争用条件?
- 此工厂方法是否会导致争用条件?
- 争用条件 2 个线程交替
- 标准::condition_variable 中可能存在的争用条件
- 启动子进程时的争用条件导致从管道读取挂起
- 当只有一个线程写入 c++ 中的布尔变量时,是否存在争用条件
- 避免在增加计数器时出现争用条件
- 是否有 std 或提升容器可以避免其插入和查找方法之间的争用条件
- 增强进程间争用条件预防
- pthread_once() 中的争用条件
- 发布标准实现争用条件