【问题标题】:Threads with fifo带有 fifo 的线程
【发布时间】:2012-12-17 03:49:19
【问题描述】:

我有下面的应用程序,其中线程 1 从文件中读取并放入 FIFO,然后线程 2 读取该 FIFO 并处理数据并发送到网络套接字,线程 3 正在从网络套接字接收数据,然后将结果保存到file2 但有时接收到的数据必须由 thread2 重新处理,所以问题是最好的做法是什么?我需要再次发送到 FIFO 吗?或者在线程 3 和线程 2 之间有另一个 fifo?还是都没有?

File1 --> 线程 1 --> FIFO --> 线程 2 --> 网络套接字

网络套接字 --> 线程 3 --> 文件 2

顺便说一句,以上是我的一个示例,实际程序会有很多线程从 FIFO 读取并发送到网络,不确定这种方式使用 FIFO 是否会导致延迟或会成为瓶颈。

感谢您的帮助。

【问题讨论】:

  • 什么情况下需要重新处理数据?是不是一开始就可以被线程 2 检测到?
  • 线程 2 有无限循环,它会处理 fifo 中的任何内容,因此没有线程 2 检测不到任何内容
  • 我担心从 FIFO 中读取的数据不止一个,不确定这是否会成为瓶颈
  • 当然,但是在这种情况下,“再处理”是什么意思?您的意思是“再次将数据发送到线程 3?”。以及在什么条件下需要重新处理?

标签: c multithreading ipc fifo


【解决方案1】:

嗯,

没有使用监视文件和套接字描述符数组的select系统调用是否有特殊原因?这可以简化代码,如 here 所示。

你是在使用 pthreads 还是类似 boost 线程库的东西...

这些线程确实是不同的进程吗...或者这是您使用 pthread_cond_wait() 的所有一个程序?

【讨论】:

  • 我正在使用 pthread,全部在一个程序中,我没有使用 pthread_cond_wait()
  • 通常,您使用互斥锁来保护条件变量。这些是多个过程吗?就像我问的那样?...如果只是一个进程,那么没有 mmap 文件...使用 pthread_mutex_init()
  • 我不使用锁的原因是因为我发送的数据少于 pipe_buff,所以同步将由内核完成,不,这是一个进程
  • pipe_buf 是由 mkdev 还是 mknod 创建的实际 FIFO?你应该根据outflux.net/blog/archives/2008/03/09/using-select-on-a-fifo/…>打开FIFO进行读取,这样就解决了select的问题。
  • 我是用o_nonblock选项打开fifo的,其实这部分和同步都没有问题,就算有问题我们也无视吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多