我正在使用C编写linux平台的代码。假设我有两个线程。A和B.
A是一个无限循环,并不断地试图找出套接字本地主机上是否有数据:8080,其中as B是一个线程,其大部分时间都处于阻塞状态,直到A调用互斥对象上的互斥锁函数(B用来阻止自己)为止。当接收到套接字上的适当数据时,A将解锁B。
你看,这是个问题。B在很大程度上是“事件驱动的”,而A则处于恒定的运行状态。我的目标平台资源不丰富,所以我希望A能够被“激活”,只在它接收到套接字上的数据时才进入运行状态,而不是不断循环。
那我该怎么做呢?如果这很重要,我希望对UDP和TCP套接字都这样做。
发布于 2022-08-09 08:20:51
这里有很多你想做的事。一种方法,您已经在使用,是一个事件系统。一个真正的事件系统对于您正在处理的那种问题来说是过分的,但是可以找到这里。这是一个(随机)更好的实现,能够侦听多个文件描述符和基于时间的事件,所有这些都在一个线程中。
如果您想自己构建一个函数,那么您应该看看select或poll函数。
但是我同意@Jeremy的观点,你应该使用为套接字编程而设计的函数,它们非常适合你的问题。只有当您真正需要时才使用事件系统方法(带有多个套接字/定时事件)。
发布于 2022-08-09 14:54:01
您只需调用recv (或recvfrom、recvmsg等),直到收到一些数据后才会返回。没有必要“不断地试图找出是否有数据”--这是愚蠢的。
如果您将套接字设置为非阻塞模式,那么即使没有数据,recv也会返回。如果这就是您要做的,那么解决方案很简单:不要将套接字设置为非阻塞模式。
https://stackoverflow.com/questions/73286126
复制相似问题