Multithreading 带有信号量和伪随机数的概念性多线程

Multithreading 带有信号量和伪随机数的概念性多线程,multithreading,random,semaphore,Multithreading,Random,Semaphore,这是一个非常普遍的问题,主要是概念性的。我正在考虑测试随机数生成器,看看它在遵循某个x值的均匀分布时的有效性(掷骰子的例子是6)。在一个简单的循环中这样做是我现在的做法,但我考虑的是多线程模拟 我想知道这是否会给我带来任何加速,因为我只有一个随机数生成器在所有具有信号量保护的线程之间共享(需要确保没有两个线程访问并同时生成随机数,这意味着结果重复) 由于每个线程几乎没有其他操作(如果用于检查和递增x的语句),线程甚至会给我更快的结果,或者依赖于一个随机数生成器意味着它本质上与单个线程相同?我想你

这是一个非常普遍的问题,主要是概念性的。我正在考虑测试随机数生成器,看看它在遵循某个x值的均匀分布时的有效性(掷骰子的例子是6)。在一个简单的循环中这样做是我现在的做法,但我考虑的是多线程模拟

我想知道这是否会给我带来任何加速,因为我只有一个随机数生成器在所有具有信号量保护的线程之间共享(需要确保没有两个线程访问并同时生成随机数,这意味着结果重复)


由于每个线程几乎没有其他操作(如果用于检查和递增x的语句),线程甚至会给我更快的结果,或者依赖于一个随机数生成器意味着它本质上与单个线程相同?

我想你已经回答了你自己的问题。您的计划将导致RNG的单线程使用,不同的线程轮流使用。您可能会实现一个加速,但只是一个负加速。

我想您已经回答了自己的问题。您的计划将导致RNG的单线程使用,不同的线程轮流使用。您可能会实现一个加速,但只是一个负的加速。

从理论上讲,您应该看到性能的提高,至少在线程数等于正在使用的内核数之前。然而,在现实中,您将添加代码(从而增加执行时间)来处理多线程基础结构,如果每个线程的大部分时间都花在等待缓慢的RNG上,您可能会看到性能下降

另一方面,您可以通过一些聪明的方法来提高性能。例如,您可能有一个任务专门用于生成随机数,如果您只查找1到6之间的值,则可以从RNG的每个结果生成多个值。您可以将这些值放入队列中,并让其他任务从队列中读取。当然,您必须小心,您的优化不会改变RNG的分布


除非计算执行周期的想法让你兴奋,否则找到答案的最佳方法就是尝试。使用分析器找出大部分时间都花在了什么地方总是很有教育意义的——众所周知,单凭直觉很难做到这一点,即使是有经验的开发人员也常常对结果感到惊讶。

理论上,您应该看到性能的提高,至少在线程数等于正在使用的内核数之前。然而,在现实中,您将添加代码(从而增加执行时间)来处理多线程基础结构,如果每个线程的大部分时间都花在等待缓慢的RNG上,您可能会看到性能下降

另一方面,您可以通过一些聪明的方法来提高性能。例如,您可能有一个任务专门用于生成随机数,如果您只查找1到6之间的值,则可以从RNG的每个结果生成多个值。您可以将这些值放入队列中,并让其他任务从队列中读取。当然,您必须小心,您的优化不会改变RNG的分布

除非计算执行周期的想法让你兴奋,否则找到答案的最佳方法就是尝试。使用剖析器找出大部分时间都花在了什么地方总是很有教育意义的——众所周知,人类很难单凭直觉就搞定,即使是经验丰富的开发人员也常常对结果感到惊讶

需要确保没有两个线程访问并同时生成随机数 同时

这意味着实际上只运行一个工作线程,所以您不会使用多线程的好处。或者我遗漏了一点,您提到了跨多线程分发一些工作

如果您在RNG访问中从多个线程中改进整体设计,请考虑使用<代码> Read RealthRoCK/<代码>技术,而不是<代码>信号量< /代码> .< 需要确保没有两个线程访问并同时生成随机数 同时

这意味着实际上只运行一个工作线程,所以您不会使用多线程的好处。或者我遗漏了一点,您提到了跨多线程分发一些工作


如果你在RNG访问中从多个线程中改进整体设计-考虑使用<代码> Read RealthRoCKORD <代码>技术,而不是<代码>信号量< /代码> .< /P>“实现加速”真的意味着“影响速度”吗?加速对我来说意味着积极。“实现加速”真的意味着“影响速度”?加速对我来说意味着积极的。我想可能会有一定程度的加速,因为一个线程将访问rng,然后必须检查并包含相应的值。当它这样做时,另一个线程将访问rng。另外,我很好奇ReaderWriterLock和他的可能会有所帮助,生成下一个数字是否需要重写器访问rng以更新种子值?在这里,我绝对是在胡说八道。我相信解决方案取决于RNG的实现,您是使用自制的还是内置的?您正在使用哪种语言/框架进行开发?目前我正在使用C#内置rng。我想可能会有一定程度的加速,因为一个线程将访问rng,然后必须检查并包含相应的值。当它这样做时,另一个线程将访问rng。另外,我很好奇ReaderWriterLock和他的可能会有所帮助,生成下一个数字是否需要重写器访问rng以更新种子值?我肯定是在胡说八道。