随机无符号整数通过32个线程生成(c++ 11)
Random unsigned integer generated via 32 threads (C++11)
作为一个编程练习,我认为尝试编写一个使用多个线程来生成随机数的程序会很有趣。这种方法会引入OS调度器的"混沌"来增加随机性。
32线程的想法是每个线程将设置一个数字的单个位(左移和'或'与随机0/1)。它们都从a生成随机的比特梅森扭扭机和只是'和'与1。编辑:正如Jarod42指出的,每个线程不能共享相同的随机引擎。假设每个线程都有自己的引擎。
std::mt19937 eng(/*some std::seed_seq to initialize*/);
在这一点上,我将描述我的想法实现。
一个选项是在每次调用函数时启动线程。
unsigned int GetRandom() {
std::vector<std::thread> myThreads;
std::mutex numMutex;
unsigned int num = 0;
auto BitSetFunction = [&](){
std::lock_guard<std::mutex> numLockGuard(numMutex);
num <<= 1;
num |= eng() & 1;
};
for (int i=0; i<32; ++i) {
myThreads.emplace(myThreads.end(), BitSetFunction);
}
for (std::vector<std::thread>::iterator it=myThreads.begin(); it!=myThreads.end(); ++it) {
(*it).join();
}
return num;
}
然而,我怀疑的问题,有时看到,是线程的创建通常比实际锁定,设置位和锁锁慢。如果是这样的话,线程就会按顺序执行,它就不会那么有趣了。此外,为每次调用创建线程以获取随机数的开销是巨大的(我假设)。
有更聪明的方法吗?我想创建一个对象,从它的构造线程启动并始终运行,但等待一个条件变量知道什么时候产生一个新的随机数。我在这里遇到的问题是在对象的销毁,线程也被销毁并抛出错误,因为它们仍在执行。
我只是想听听其他的想法。
假设您有n个线程,并且您希望保证它们实际上在同一时间生成随机数。你可以这样做:
- 步骤1:运行所有的线程
- 步骤2:线程等待类似的信号(可能直到某个时刻)
- 步骤3:当信号到达时,所有线程都在执行任务
- 步骤4:在任务完成后,他们以某种方式返回输出
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- C++为线程工作动态地分割例程
- 为什么我不能在 while 循环中创建线程?