延迟两个线程之间的通信

时间:2012-05-21 17:08:11

标签: c linux multithreading pthreads communication

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

  

thread1(1kHz)< ---> 10ms< ---> thread2(1kHz)

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

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

UPDATE :我不想同步线程的通信,但在它们之间添加延迟。 如果thread1在时间1s写入内容,则另一个线程应该只能在1s + 10ms时读取它。

4 个答案:

答案 0 :(得分:1)

这听起来不像是性能问题,所以请简单一点。不需要复杂的数据结构,额外的线程等。

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

创建一个数组来保存至少10个结构。去100是安全的。这里不会使用大量内存,所以谁在乎。哎呀,只要它需要成长,你就可以把它当成它。

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

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

  1. 检查其数组中第一个项目的时间戳,如果是旧的话 足够将该数据发送到另一个线程。发送后,减少 计数并将数组中的其余项目记忆下来 缺口。
  2. 使用。将当前/新数据添加到数组的末尾 当前时间戳并增加计数。
  3. 重复其他线程。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我无法从问题中看出作者和读者线程之间的通信是否需要可靠(如:作者线程发送的所有消息都保证读者线程以正确的顺序看到)。如果是这样,并且如果你使用单个全局结构作为共享数据,那么你实际上是在实现一个缓冲区大小为1的FIFO。很容易让线程间通信错误,所以我建议你看一下喜欢glib的asynchronous queues。如果您需要从头开始实现自己的,那么查看该代码可能是一个很好的起点。

答案 3 :(得分:0)

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