多线程C pthreads模拟器的可重现随机序列

时间:2013-08-28 19:55:29

标签: c multithreading random pthreads

我正在C中使用Wa-tor模拟器,但要求非常严格,我对如何在具有相同参数的调用之间正确获得可​​重现行为感到困惑。

Wa-tor基本上是一个二维细胞阵列,只能含有水,鱼或鲨鱼。

我所拥有的是(我将尝试仅列出了解问题的有趣之处):

  • 配置文件,用户可以在其中指定整数种子,以及其他选项
  • 一个主进程,它解析配置文件并根据用户的请求生成(fork + execve)多个worker子进程。此外,它将收集所有工人的状态,将其显示为单个大网格。工作人员通过UNIX套接字文件与master通信。
  • 许多多线程(pthreads)工作进程。

工作人员连接到主套接字并接收模拟参数,包括用户指定的种子(当种子在工作者之间区分工作者ID时。工作者ID是主人可重复分配给它的渐进数字。 worker并且包含在execve的命令行中,因此工作人员可以在连接到master的套接字时识别并且每次都被分配到同一网格部分。)

工作人员随机初始化其子网格,将其发送给主人,然后从/向邻近工人接收/发送边界值。

从现在开始,工人的状态在称为chronon的不连续步骤中演变。在每个步骤中,工作人员为其子网格的每个生物计算随机动作,然后与相邻工作者和主人交换更新。

一个线程侦听信号,而另一个例程处理"模拟"部分。此模拟例程 - 在每个步骤结束时 - 产生4个其他线程以向相邻线程发送更新,4以接收更新,1向主机发送状态。此线程将在开始另一步之前加入。

我现在正在做的是处理随机数的生成,就是要有一个全局的" unsigned int SEED",它提供了从主站开始时收到的值。工作进程(在生成任何线程之前),并使用" extern"包含在我需要它的每个文件中关键词。所以我在调用" rand_r(& SEED)"时使用它的地址。

第一个问题是在调用rand_r之后SEED的值没有更新,相反我可以观察到运行单线程应用程序。我忘记了什么?

然后我问一个全局变量是否是一种正确的方法,可以获得可重复的序列,承认rand_r可以被不同的线程调用,并且行动的顺序可能随着工作者之间的沟通而变化。 ; t遵循严格的顺序, - 如果不是这样的话,从单个整数值开始作为种子?要求是,从相同的确切参数和种子开始,两个执行步骤产生相同的结果(就像任何可敬的模拟器,我想:)

P.S。我想切换到drand48_r(),但汤是一样的,我猜。

此致 DR

1 个答案:

答案 0 :(得分:3)

通过使用单个全局变量SEED,rand_r的行为不是线程安全的 - 如果每个线程有一个种子变量,它将是线程安全的。我建议在初始时使用初始SEED中的rand_r为每个线程生成一个不同的种子。然后每个线程使用自己的相同随机序列独立运行。