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

时间:2015-08-06 18:24:46

标签: c++ multithreading c++11 random mersenne-twister

作为一项编程练习,我认为尝试编写一个使用多个线程的程序生成随机数会很有趣。这种方法会引入混乱" OS调度程序添加随机性。

32个线程的想法是每个线程将设置一个数字的单个位(左移和'或'随机0/1)。它们每个都从a生成随机位 Mersenne Twister引擎,只是'和' 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;
}

然而,我怀疑并且有时看到的问题是,线程的创建通常比实际锁定,位的设置和解锁更慢。如果是这种情况,线程将按顺序执行,并且它不会那么有趣。另外,为每个调用创建线程以获取随机数的开销很大(我假设)。

有更聪明的方法吗?我想到了创建一个对象,并且从它的构造开始,线程被启动并且始终在运行,但是等待一个条件变量来知道何时产生一个新的随机数。我遇到的问题是对象的破坏,线程也被破坏并抛出错误,因为它们仍然在执行。

我只是好奇地听到其他一些想法。

1 个答案:

答案 0 :(得分:0)

假设您有n个线程,并且您希望保证它们实际上在同一时间生成随机数。你可以这样:

  • 第1步:运行所有线程
  • 第2步:线程等待类似的符号(可能直到某个时刻)
  • 第3步:当符号到达时,所有线程都在执行任务
  • 第4步:任务完成后,以某种方式回馈输出