我正在尝试使用eventfd进行同步b / w两个线程。请看下面的代码。在这个if主线程首先获得锁定它不会释放除非我在写入函数后取消注释睡眠。如果线程首先获得锁定,则确实如此。请写信后告诉我如何在不使用睡眠的情况下处理。
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
int event_fd;
uint64_t counter;
void * Thread1(void *p)
{
printf("\n%s eventfd = %d\n",(char*)p, event_fd);
while(1)
{
read(event_fd, &counter,sizeof(counter));
printf("\n %s function counter = %llu\n",(char*)p,counter);
sleep(1);
write(event_fd,&counter,sizeof(counter));
//sleep(1);
}
return NULL;
}
void main()
{
char str[]="In Thread1";
int ret;
pthread_t p_th;
printf("Events demonstration pid = %d sizeof counter %lu\n ",getpid(),sizeof(counter));
event_fd=eventfd(1,0);
printf("event_fd %d\n",event_fd);
pthread_create(&p_th,NULL,Thread1, str);
while(1)
{
read(event_fd, &counter,sizeof(counter));
printf("\n In main function counter = %llu\n",counter);
sleep(1);
write(event_fd,&counter,sizeof(counter));
//sleep(1);
}
pthread_exit (NULL);
}
答案 0 :(得分:0)
首先,他们没有锁定。它们是eventfd
信号量。
其次,它们不包含线程之间的公平性。因此,如果省略sleep()
子句,则在下一个read
释放信号量时,将再次获取信号量。 eventfd
更常用于生产者消费者环境,其中一端是write
,另一端是read
。