随机无符号整数通过32个线程生成(c++ 11)

Random unsigned integer generated via 32 threads (C++11)

本文关键字:c++ 线程 无符号整数 32个 随机      更新时间:2023-10-16

作为一个编程练习,我认为尝试编写一个使用多个线程来生成随机数的程序会很有趣。这种方法会引入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:在任务完成后,他们以某种方式返回输出