C 意外的pthread函数输出

C 意外的pthread函数输出,c,multithreading,pthreads,posix,C,Multithreading,Pthreads,Posix,我是C语言的新手,正在学习信号量。我试图使用pthreads、mutex和信号量实现一种复杂的情况 这个想法是一个信号灯,代表一台服务器,让人们坐在两张桌子上(每个桌子4个位置,总共8个位置)。每个表也由一个计数信号量控制。每个板由互斥器控制,以避免竞争条件。每个人都由一条线表示 我不明白为什么在我的代码中,同一个客户一直在吃东西,而且似乎没有增加 代码: 编辑: 更新pthread_create的最后一个参数可以解决客户递增的问题: pthread_create(&customer[j

我是C语言的新手,正在学习信号量。我试图使用pthreads、mutex和信号量实现一种复杂的情况

这个想法是一个信号灯,代表一台服务器,让人们坐在两张桌子上(每个桌子4个位置,总共8个位置)。每个表也由一个计数信号量控制。每个板由互斥器控制,以避免竞争条件。每个人都由一条线表示

我不明白为什么在我的代码中,同一个客户一直在吃东西,而且似乎没有增加

代码:

编辑:

更新pthread_create的最后一个参数可以解决客户递增的问题:

pthread_create(&customer[j],NULL,(void *)eat,(void *) (intptr_t) j);
然而,它从6开始,然后是索引越界类型的问题

控制台输出现在:

starting thread, semaphore is unlocked.
Creating mutex for plate 0
Creating mutex for plate 1
Creating mutex for plate 2
Creating mutex for plate 3
Creating mutex for plate 4
Creating mutex for plate 5
Creating mutex for plate 6
Creating mutex for plate 7
Creating thread for customer 0
Creating thread for customer 1
Creating thread for customer 2
Creating thread for customer 3
Creating thread for customer 4
Creating thread for customer 5
Creating thread for customer 6
Creating thread for customer 7
Creating thread for customer 8
Creating thread for customer 9
Customer 6 is eating
Customer 7 is eating
Illegal instruction (core dumped)
排队

pthread_create(&customer[j],NULL,(void *)eat,&j);
将变量
j
的地址作为参数传递给线程。将相同的地址传递给相同的变量,并将其传递给所有线程

循环结束后,
j
的值将等于
customer\u count
,这就是线程可以用作数组索引的内容。这是因为curseo越界导致未定义的行为

至于一个可能的解决方案,这实际上是一个可以接受将整数值转换为指针,然后在线程中将其转换回的位置。不过,这需要分几个步骤来完成。首先,在创建线程时:

pthread_create(&customer[j],NULL,(void *)eat, (void *) (intptr_t) j);
然后在线程本身中:

int n = (int) (intptr_t) i;
排队

pthread_create(&customer[j],NULL,(void *)eat,&j);
将变量
j
的地址作为参数传递给线程。将相同的地址传递给相同的变量,并将其传递给所有线程

循环结束后,
j
的值将等于
customer\u count
,这就是线程可以用作数组索引的内容。这是因为curseo越界导致未定义的行为

至于一个可能的解决方案,这实际上是一个可以接受将整数值转换为指针,然后在线程中将其转换回的位置。不过,这需要分几个步骤来完成。首先,在创建线程时:

pthread_create(&customer[j],NULL,(void *)eat, (void *) (intptr_t) j);
然后在线程本身中:

int n = (int) (intptr_t) i;

这就是诀窍——但它从6点开始。编辑了一点我的问题,如果你对此有所了解的话。@user25976线程运行的顺序是不确定的。操作系统可以按照它认为合适的顺序运行它们。@user25976至于崩溃,您需要使用调试器来定位它。如果你不能在调试器的帮助下解决这个问题,可能会问一个新问题。我最初打开了一个关于这个问题的线程,并认为我找到了答案。取得了错误的进展,现在我又回到了起点。如果你有任何建议,一定要让我知道:这就是诀窍——但它从6点开始。编辑了一点我的问题,如果你对此有所了解的话。@user25976线程运行的顺序是不确定的。操作系统可以按照它认为合适的顺序运行它们。@user25976至于崩溃,您需要使用调试器来定位它。如果你不能在调试器的帮助下解决这个问题,可能会问一个新问题。我最初打开了一个关于这个问题的线程,并认为我找到了答案。取得了错误的进展,现在我又回到了起点。如果您有任何建议,请务必告诉我: