如何在recv()和sem_wait()上同时等待?

时间:2015-02-15 23:04:55

标签: multithreading sockets posix semaphore

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

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

由于posix中没有像WaitForMultipleObjects()这样的锁定,因此您只有有限的选项。

一个。使用select(2)并收到有关套接字更改事件的通知

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

或C.使用像libevent

这样的库实现

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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