这是一个非常普遍的问题,主要是概念性的。我正在考虑测试随机数发生器,看看它在一些x值上的均匀分布的有效性(骰子掷骰的前6)。在一个简单的循环中这样做是我现在的方式,但我正在考虑多线程模拟。
我想知道这是否会给我任何加速,因为我只有一个随机数生成器在所有具有信号量保护的线程之间共享(需要确保没有两个线程访问并同时生成随机数意味着重复结果) 。
由于每个线程几乎没有其他操作(只是用于检查和递增x的语句)会线程化它甚至会给我更快的结果,或者依赖于一个随机数生成器意味着它基本上与单个线程相同?
答案 0 :(得分:5)
我想你已回答了自己的问题。您的计划将导致RNG的单线程使用,不同的线程轮流成为使用中的单个线程。你可能会达到加速,但只是负面加速。
答案 1 :(得分:0)
理论上,您应该看到性能提升,至少在线程数等于正在使用的核心数之前。但是,实际上,您将添加代码(因此执行时间)来处理多线程基础结构,如果每个线程的大部分时间都花在等待慢速RNG上,您可能会看到性能下降。
另一方面,您可以通过一些聪明来提高性能。例如,您可能有一个专门用于生成随机数的任务,如果您只查找1到6的值,则可以从RNG的每个结果生成多个值。您可以将这些值放入队列中,并让其他任务从队列中读取。当然,您必须小心,您的优化不会改变RNG的分布。
除非计算执行周期的想法让你感到兴奋,否则找到答案的最好方法就是尝试。使用分析器找出大部分时间花费的地方总是很有教育意义 - 人类通过独立直觉来解决这个问题是非常困难的,即使是经验丰富的开发人员也常常对结果感到惊讶。
答案 2 :(得分:0)
需要确保没有两个线程访问并生成随机数 同时
这意味着实际上只运行一个工作线程,因此您不会使用多线程的好处。或者我错过了你提到在多元线程中分发一些作品的一点?
如果您以某种方式改善了来自多个线程的RNG访问的整体设计 - 请考虑使用ReaderWriterLock
技术而不是Semaphore
。