gpt4 book ai didi

c - 使用eventfd同步时无法获取锁

转载 作者:行者123 更新时间:2023-11-30 17:18:47 25 4
gpt4 key购买 nike

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

#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 更常用于生产者消费者环境,其中一端执行写入,另一端执行读取

关于c - 使用eventfd同步时无法获取锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29076362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com