C 当eventfd用于同步时,无法获取锁

C 当eventfd用于同步时,无法获取锁,c,linux,C,Linux,我正在尝试使用eventfd与两个线程进行同步。请看下面的代码。在这种情况下,如果主线程首先获得锁,它将不会释放,除非我取消对write函数之后的sleep的注释。如果线程首先获得锁,则为true。请让我知道如何处理不使用睡眠后写 #include <pthread.h> #include <stdint.h> #include <stdio.h> int event_fd; uint64_t counter; void * Thread1(void *p)

我正在尝试使用eventfd与两个线程进行同步。请看下面的代码。在这种情况下,如果主线程首先获得锁,它将不会释放,除非我取消对write函数之后的sleep的注释。如果线程首先获得锁,则为true。请让我知道如何处理不使用睡眠后写

#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);
}
#包括
#包括
#包括
国际事件(fd);
uint64_t计数器;
void*Thread1(void*p)
{
printf(“\n%s eventfd=%d\n”,(char*)p,event\u fd);
而(1)
{
读取(事件和计数器,大小(计数器));
printf(“\n%s函数计数器=%llu\n”,(char*)p,计数器);
睡眠(1);
写入(事件和计数器、大小(计数器));
//睡眠(1);
}
返回NULL;
}
void main()
{
char str[]=“在线程1中”;
int ret;
pthread_t p_th;
printf(“事件演示pid=%d sizeof计数器%lu\n”,getpid(),sizeof(计数器));
event_fd=eventfd(1,0);
printf(“事件\u fd%d\n”,事件\u fd);
pthread_create(&p_th,NULL,Thread1,str);
而(1)
{
读取(事件和计数器,大小(计数器));
printf(“\n在主函数计数器中=%llu\n”,计数器);
睡眠(1);
写入(事件和计数器、大小(计数器));
//睡眠(1);
}
pthread_exit(NULL);
}

首先,它们不是锁。它们是
eventfd
信号量

其次,它们不包含线程间公平性的规定。因此,如果省略了
sleep()
子句,那么在下一次
read
释放信号量时,信号量将再次被抓取
eventfd
更常用于生产者-消费者环境,其中一端执行
写入
,另一端执行
读取