我有一个线程,当数据准备好通过recv()读取或信号量S发出信号时,必须解除阻塞。
这有什么办法吗?
由于在posix中没有像WaitForMultipleObjects()这样的锁,所以你只有有限的选择。
WaitForMultipleObjects()
A.使用select(2)并收到有关套接字更改事件的通知
B.或poll(2)并通知文件描述符事件
或C.使用像libevent这样的库实现
您可以用futex替换POSIX信号量,并在套接字和futex上选择/ poll。
我对这个问题的解决方案是使用一对套接字而不是信号量。特别是,您可以调用socketpair()来获取一对连接的套接字;将其中一个套接字提供给线程A,将另一个套接字提供给线程B,然后任一线程都可以通过在其套接字上发送一个字节来唤醒另一个线程(阻塞select(/ / poll()/ etc)。