c++ - 作为随机数生成器的竞争条件
问题描述
我在运行它时通过“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>
。
推荐阅读
- drop-down-menu - Bootstrap 5 下拉菜单失败
- c# - 从另一个表单类访问数据集
- apache-spark - Pyspark - 在 enableHiveSupport() 时创建增量表
- laravel - CloudFlare 无效的 SSL 证书
- javascript - MongoDB/Mongoose - 查找特定日期在日期范围内的所有位置
- c# - 如何计算一个字符串值列表并计算它在给定文件中重复的次数
- javascript - addEventListener 在第一次执行后停止
- r - 使用 nls 进行指数回归
- mongodb - 如何仅打印 MongoDB 中子嵌入文档中的值?
- java - 如何在连接期间忽略空字符串?