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

时间:2015-03-16 12:04:15

标签: c linux

我正在尝试使用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);
}

1 个答案:

答案 0 :(得分:0)

首先,他们没有锁定。它们是eventfd信号量。

其次,它们不包含线程之间的公平性。因此,如果省略sleep()子句,则在下一个read释放信号量时,将再次获取信号量。 eventfd更常用于生产者消费者环境,其中一端是write,另一端是read