gpt4 book ai didi

用于轮询工作线程任务完成状态的C文件描述符

转载 作者:行者123 更新时间:2023-11-30 14:35:37 25 4
gpt4 key购买 nike

我有一个 C 项目,有 2 个线程:main_threadworker_thread。下面的伪代码对此进行了解释。

TASK g_task[MAX_TASK];
worker_thread()
{
do {
listen_for_task on g_task
do_task(0);
} while(0);
}

int post_task(msg)
{
post on g_task
/* I am planning for a kind of file descriptor to return from here */
/* on which main thread polls along with sock_fd */
return fd;
}

main_thread()
{
int sock_fd;

/* sock_fd listens on well known TCP port for msgs from clients */
/* Using epoll */
ev.events = EPOLIN;
ev.data.fd = sock_fd;
epoll_ctl(epollfd, EPOLL_CTL_ADD, sock_fd, &ev);
do {
nfs = epoll_wait(...)
if (nfs > 0) {
/* I read the msg from from sock_fd and post to g_task */
post_task(msg)
}
} while (0);
}

main_thread 上,我正在 TCP 套接字上等待来自各个客户端的消息。我正在处理并将要完成的工作发布到另一个线程worker_thread

现在我希望 worker_thread 在完成发布给它的每个任务后通知 main_thread。我期望该事件应该到达一个新的文件描述符。这意味着我期望 post_task 应该返回一个新的 fd ,我可以将其添加到 epollfd 中。并且 worker_thread 应该唤醒它。

有什么建议可以实现这一目标吗?

最佳答案

既然你提到使用epoll,那么你一定使用的是Linux。这意味着您可以使用 eventfd() .

基本上,您的 post_task 函数为每个线程创建一个新的 eventfd 描述符,并且主线程在 epoll 中监视它的可读性。完成后,线程将一个 64 位整数写入其描述符。然后,主线程从 epoll 中唤醒,发现事件可读,从中读取 64 位整数,并在知道关联线程已完成任务后执行所需执行的任何操作。 (在非 Linux 系统上,您可以使用 pipe() 获得类似的效果;我编写了带有事件创建函数的代码,该函数根据目标操作系统在两者之间切换)

如果您需要传递的信息不仅仅是“我完成了”状态,我喜欢使用使用 socketpair() 创建的 Unix 域数据报套接字。以及读取/写入包含所有所需数据的结构。如果包含线程 ID,所有线程甚至可以共享同一个套接字。

关于用于轮询工作线程任务完成状态的C文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com