【问题标题】:How to wait simultaneously on both recv() and sem_wait()?如何同时等待 recv() 和 sem_wait()?
【发布时间】:2015-02-15 23:04:54
【问题描述】:

当数据准备好通过 recv() 读取或信号量 S 发出信号时,我有一个必须解除阻塞的线程。

有什么办法吗?

【问题讨论】:

    标签: multithreading sockets posix semaphore


    【解决方案1】:

    由于在 posix 中没有像 WaitForMultipleObjects() 这样的锁,所以您只有有限的选择。

    A.使用select(2) 并在套接字更改事件时得到通知

    B.或poll(2) 并收到有关文件描述符事件的通知

    或 C. 使用一些库实现,如 libevent

    【讨论】:

      【解决方案2】:

      您可以用 futex 替换 POSIX 信号量,并在套接字和 futex 上选择/轮询。

      【讨论】:

        【解决方案3】:

        我对这个问题的解决方案是使用一对套接字而不是信号量。特别是,您可以调用 socketpair() 来获取一对已连接的套接字;将一个套接字提供给线程 A,将另一个套接字提供给线程 B,然后任何一个线程都可以通过在其套接字上发送一个字节来唤醒另一个线程(在 select()/poll()/etc 内阻塞)。

        【讨论】:

          猜你喜欢
          • 2013-11-16
          • 2014-08-22
          • 2020-09-05
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-03
          相关资源
          最近更新 更多