我正在尝试使用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/

10-13 09:17