首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现事件驱动的POSIX线程?

如何实现事件驱动的POSIX线程?
EN

Stack Overflow用户
提问于 2022-08-09 03:09:51
回答 2查看 97关注 1票数 0

我正在使用C编写linux平台的代码。假设我有两个线程。A和B.

A是一个无限循环,并不断地试图找出套接字本地主机上是否有数据:8080,其中as B是一个线程,其大部分时间都处于阻塞状态,直到A调用互斥对象上的互斥锁函数(B用来阻止自己)为止。当接收到套接字上的适当数据时,A将解锁B。

你看,这是个问题。B在很大程度上是“事件驱动的”,而A则处于恒定的运行状态。我的目标平台资源不丰富,所以我希望A能够被“激活”,只在它接收到套接字上的数据时才进入运行状态,而不是不断循环。

那我该怎么做呢?如果这很重要,我希望对UDP和TCP套接字都这样做。

EN

回答 2

Stack Overflow用户

发布于 2022-08-09 08:20:51

这里有很多你想做的事。一种方法,您已经在使用,是一个事件系统。一个真正的事件系统对于您正在处理的那种问题来说是过分的,但是可以找到这里。这是一个(随机)更好的实现,能够侦听多个文件描述符和基于时间的事件,所有这些都在一个线程中。

如果您想自己构建一个函数,那么您应该看看selectpoll函数。

但是我同意@Jeremy的观点,你应该使用为套接字编程而设计的函数,它们非常适合你的问题。只有当您真正需要时才使用事件系统方法(带有多个套接字/定时事件)。

票数 0
EN

Stack Overflow用户

发布于 2022-08-09 14:54:01

您只需调用recv (或recvfromrecvmsg等),直到收到一些数据后才会返回。没有必要“不断地试图找出是否有数据”--这是愚蠢的。

如果您将套接字设置为非阻塞模式,那么即使没有数据,recv也会返回。如果这就是您要做的,那么解决方案很简单:不要将套接字设置为非阻塞模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73286126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档