我正在尝试使用eventfd进行黑白同步两个线程。请看下面的代码。在这种情况下,如果主线程首先获取了锁,除非我在写函数后取消注释睡眠,否则它将不会释放。如果线程先获得锁,这是事实。写完后请让我知道如何不使用睡眠。
#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);
}
最佳答案
首先,它们不是锁。它们是eventfd
信号量。
其次,它们不包含线程间公平性的规定。因此,如果省略sleep()
子句,则在下一个read
释放该信号量时,该信号量将再次被抓住。 eventfd
通常用于生产者消费者环境,其中一端在执行write
,另一端在执行read
。
关于c - 使用eventfd进行同步时无法获取锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29076362/