Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在epoll中同步pthreads?_C_Multithreading_Pthreads_Epoll - Fatal编程技术网

C 如何在epoll中同步pthreads?

C 如何在epoll中同步pthreads?,c,multithreading,pthreads,epoll,C,Multithreading,Pthreads,Epoll,我仍在尝试实现线程间通信,我不知道如何让线程在共享数据块可用时读取它。问题是:我在每个线程中监听epoll中的几个套接字,如果我从其中一个线程接收到信息,我需要通知其他线程读取它 我尝试了使用EFD_信号量的eventfd,但它不适合,因为有一个线程可以在所有人之前读取所有数据。我找不到posix信号量或条件变量的用途,因为它们很难与EPOL一起使用 有没有办法轻松实现这种同步 更新: int k = epoll_wait(epollfd, n, events); for (i = 0; i &

我仍在尝试实现线程间通信,我不知道如何让线程在共享数据块可用时读取它。问题是:我在每个线程中监听epoll中的几个套接字,如果我从其中一个线程接收到信息,我需要通知其他线程读取它

我尝试了使用EFD_信号量的eventfd,但它不适合,因为有一个线程可以在所有人之前读取所有数据。我找不到posix信号量或条件变量的用途,因为它们很难与EPOL一起使用

有没有办法轻松实现这种同步

更新:

int k = epoll_wait(epollfd, n, events);
for (i = 0; i < k; i++) {
    int fd = events[i].data.fd;
    if (fd == eventfd) {
        if (eventfd_read(eventfd, ..) != -1)
            /* for each socket on this thread send latest_message to it */
    }
    else {
        latest_message = read_message(fd);
        eventfd_write(eventfd, 1)
    }
}
int k=epoll\u等待(epollfd,n,事件);
对于(i=0;i
这就是我正在尝试做的例子,假设RECV很少。
实际上,我想了一个更好的主意,为什么我必须将套接字绑定到线程,因为我可以有一个所有套接字的列表,让最快的线程发送消息,在消息结构上增加类似last_Receiver的变量。

检查这个。我仍然不明白,我不需要锁定线程,因为它与epoll有其他关系,比如从inet套接字和管道读取,但是互斥锁要么阻止线程,要么不解除epoll_wait的阻止,这是必需的。另外,当我解锁互斥锁时,eventfd中仍然有数据,同一线程可能会在轮询时一次又一次地锁定互斥锁。
eventfd
是正确的方法。如果它不适合你,请展示一个最小的例子,我们可以帮助你调试。