0

我有两个线程(我pthreads在 GNU/Linux 上使用)。现在他们正在使用全局变量共享信息(我知道,这不太好)。在每个周期结束时,他们必须将 5 个变量 ( doubles) 的值发送到另一个线程。我想在他们的沟通渠道中引入一个固定的时间延迟,

IE

线程1 (1kHz) <---> 10ms <---> 线程2 (1kHz)

我在想,在每个周期,我可以创建一个读取值的线程,休眠 10 毫秒,然后将其转发到另一个线程,然后死掉。这将使系统每个周期创建 2 个线程,一个用于通信通道的每个方向(每毫秒 2 个线程)。

还有其他模拟通信延迟的智能方法吗?

更新:我不想同步线程的通信,而是在它们之间添加延迟。如果 thread1 在时间 1s 写了一些东西,另一个线程应该只能在时间 1s + 10ms 读取它。

4

4 回答 4

1

这听起来不像是性能问题,所以让它变得简单。不需要复杂的数据结构、额外的线程等。

为您的数据创建一个结构,为其添加一个时间戳字段。

制作一个数组以容纳至少 10 个结构。去100是安全的。不会在这里使用很多内存,所以谁在乎。哎呀,你可以在它需要增长的时候 malloc 它。

每个线程都有一个这样的数组,以及数组中的项目计数。

当一个线程准备好发送数据时,做两件事:

  1. 检查它的数组中第一项的时间戳,如果足够大,则将该数据发送到另一个线程。发送后,减少计数并将数组中的其余项目向下移动一个档次。
  2. 将当前/新数据添加到具有当前时间戳的数组末尾并增加计数。

重复其他线程。

于 2012-05-22T02:17:03.043 回答
0

为什么不直接使用互斥锁来同步两个线程之间的通信呢?

当第一个线程需要写入数据时,它会获取互斥锁(因此其他线程在第一个更新数据时无法读取数据),更新datam,然后释放互斥锁。另一个线程在读取数据时执行类似的获取/释放方法。

于 2012-05-21T17:13:59.417 回答
0

我不能从这个问题中完全看出作者和读者线程之间的通信是否需要可靠(如:作者线程发送的所有消息都保证被读者线程以正确的顺序看到)。如果是这样,并且如果您使用单个全局结构作为共享数据,那么您实际上是在实现一个缓冲区大小为 1 的 FIFO。线程间通信很容易出错,因此我建议您查看一些东西就像 glib 的异步队列一样。如果您需要从头开始实现自己的代码,那么查看该代码可能是一个不错的起点。

于 2012-05-21T22:15:50.450 回答
0

为什么不在这里使用信号量?您可以让一个线程在信号量上等待,并让另一个线程在它完成关键部分时发出信号。

于 2012-05-22T04:23:38.703 回答