带有 fifo 的线程

Posted

技术标签:

【中文标题】带有 fifo 的线程【英文标题】:Threads with 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?”。以及在什么条件下需要重新处理? 【参考方案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的,其实这部分和同步都没有问题,就算有问题我们也无视吧。

以上是关于带有 fifo 的线程的主要内容,如果未能解决你的问题,请参考以下文章

SCHED_FIFO 高优先级线程被 SCHED_FIFO 低优先级线程抢占?

多线程单读单写fifo队列

Python 线程队列 Queue – FIFO

Python3标准库:queue线程安全的FIFO实现

线程安全 FIFO 队列/缓冲区

如何在C中创建线程的被动等待FIFO?