gpt4 book ai didi

使用信号量的消费者和生产者

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:55 25 4
gpt4 key购买 nike

我目前遇到死锁和核心转储。

在 main 之外我有以下内容

char buffer[SLOTCOUNT][SLOTSIZE];
int isEmpty[SLOTCOUNT];

FILE *myInFile;
FILE *myOutFile;

sem_t buf_lock, slot_avail, item_avail;

在主要的里面我有

int main(int argc, const char * argv[]){
//Create the basics of threads and intilize the sem
pthread_t consumer_t, producer_t;

sem_init(&buf_lock, 0, 1);
sem_init(&slot_avail, 0, 4);
sem_init(&item_avail, 0, 0);

/*Clear and clean the buffer*/
for(int i=0; i <= SLOTCOUNT; ++i){
isEmpty[i] = 0;
for(int j=0; j <= SLOTSIZE; ++j){
buffer[i][j] = NULL;
}
}

/*Check to make sure that the correct number of inputs have been provided*/
checkStart(argc);

/*Get the locations to the files and save it into a local variable. */
char inFile[sizeof(argv[1])];
char outFile[sizeof(argv[2])];
strcpy(inFile, argv[1]);
strcpy(outFile, argv[2]);

/*Load the file to read from and create the file to write to*/
fileReady(inFile, outFile);

/*Get the threads ready to return*/
pthread_create(&producer_t, NULL, producer, NULL);
pthread_create(&consumer_t, NULL, consumer, NULL);
pthread_join(producer_t, NULL);
pthread_join(consumer_t, NULL);


return 0;
}

最后,我的生产者函数

void* producer(){

/*Critical Section*/
sem_wait(&slot_avail);
printf("gets here\n");
sem_wait(&buf_lock);
printf("Never gets here\n");
for (int i = 0; i <= SLOTCOUNT; ++i){
if(buffer[i][0] == NULL) fread(buffer[i], sizeof(char), READSIZE, myInFile);
}
sem_post(&buf_lock);
sem_post(&item_avail);

/*Critical Section*/

}

目前,printf("Never gets here") 从不打印。

我想解决这个问题。

但是,如果我注释掉 sem_wait(&buf_lock),它会打印它,但随后会进行核心转储。

关于我做错了什么或如何调试核心转储的任何想法

编辑:我知道这不是解决问题的最佳方法,但是,这只是为了展示对信号量的理解。

编辑:其余代码已经过独立测试并且可以正常工作。 IE char 的大小...等等

我也试过

int errno = sem_wait(&buf_lock);
printf("%s", strerror(errno));

查看发生了什么,但它仍然锁定并且正如预期的那样打印不打印。

最佳答案

切勿在未测试其返回值的情况下使用此类库例程。特别是,sem_wait 可能会在有中断时返回(例如对于 IO)。阅读相应的手册页,了解所有函数的可能返回值以及它们如何返回错误。

一般来说,POSIX 信号量不是使用线程进行应用程序编程的正确工具。首先,它们只是一个扩展,并不是所有的POSIX系统都支持,然后真正被预见为线程间控制的基本工具的工具是pthread_mutex_tptread_cond_t .

此外,您对生产者函数的规范是错误的,您的编译器不应该在不对您咆哮的情况下接受它。系统将使用参数调用此函数,因此您在这里有未定义的行为。不要那样做,即使您不需要线程函数接收的 void* 参数,您也需要声明该参数。

另一个小问题:以 _t 结尾的名称由 POSIX 保留用于将来的扩展。它们通常指的是类型。不要将它们用于变量。

关于使用信号量的消费者和生产者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15698579/

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