【发布时间】:2010-12-02 13:46:58
【问题描述】:
我有一个双向消息通道的实现,为了减少开销,我实现了一对消息的循环缓冲区。要从一端写入另一端,请将指向消息的指针添加到一个循环缓冲区并调整其读取和写入索引。要向另一个方向写入,您对另一个缓冲区执行相同的操作,依此类推。代码小而简单,它避免了使用管道或 fifo 的开销,尽管在某些方面这可能是一个更好的解决方案。
我通过简单地检查是否有消息等待读取,以及是否没有对在将消息添加到相关数组时发出信号的条件变量进行定时等待来实现轮询。
现在我有一个应用程序需要同时在套接字(或多或少)和消息通道上等待。我现在希望我使用的是 fifo 或管道,但是由于更改代码的开销(长话短说),重写它以使用 fifo 或管道是不可行的。
有没有办法获得与条件变量关联的文件描述符?如果是这样,一次对两个文件描述符进行轮询会更容易,一个用于条件变量,一个用于套接字。
出于好奇,为了让这个问题对其他有类似问题的人更有用,是否可以获得与信号量关联的文件描述符,以便您可以同时轮询信号量和常规文件描述符?
【问题讨论】:
-
我猜你的解决方法是创建一个管道,然后启动一个线程等待 condvar 并在相关条件变为真时向管道写入一个字节。然后您可以轮询套接字和管道。如果您想概括该代码并将其称为“获取条件变量的 fd”,那么是的,您可以获取条件变量的 fd ;-)
-
@Steve,这比 JeremyP 的想法还要老套!创建一个线程?!?就为了这个!?我很高兴你在开玩笑的笑脸:)
-
@AlistairG:耸耸肩。您是说您不想更改发布 condvar 的现有代码的人,因此只需编写一个不同的接收器即可。当然,jpalacek 的想法是在 condvar 上正常等待,但接收套接字活动的信号以中断该等待,从而节省了线程。添加线程是将阻塞操作更改为异步操作的最常用方法,因此,除非您的系统上的线程限制较低,否则我认为没有必要对此感到歇斯底里:-)
-
史蒂夫,您应该将其发布为答案。鉴于 OP 要求不解决根本问题,您的答案可能是最正确的。
标签: c multithreading