中編譯的以下c代碼中的分段錯誤我們模擬了一個有一位廚師的唐杜裏雞肉午餐自助餐廳和 多個客人,這與單個生產者/多個消費者問題類似。我們 實現一個程序與多個線程,其中每個線程持有一個廚師或客人。 我們還應用了一個同步工具 - 信號量,它可以解決將公共資源與多個線程同步的問題。通過這個項目,我們將學習如何創建多線程進程以及如何使用信號量來同步線程。我們在linux
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
struct threadInfo
{
int id;
};
/* input variables */
int nofCustomers=4,item,nofChicken=3;
pthread_attr_t attr; /*Set of thread attributes*/
pthread_t chef_t,customer_t[100];
/* the semaphores */
sem_t full, empty;
void *chef(void *param); /* the producer thread */
void *customer(void *param); /* the consumer thread */
void initializeData()
{
/* Create the full semaphore and initialize to 0 */
sem_init(&full, 0, 0);
/* Create the empty semaphore and initialize to BUFFER_SIZE */
sem_init(&empty, 0, nofChicken);
/* Get the default attributes */
pthread_attr_init(&attr);
}
生產者
/* Producer Thread */
void *chef(void *param)
{
printf("Chef Starts Cooking\n");
while(1)
{
/* acquire the empty lock */
sem_wait(&empty);
if(insert_item())
{
fprintf(stderr, " Producer report error condition\n");
}
/* signal full */
sem_post(&full);
sleep(1);
}
}
消費者
/* Consumer Thread */
void *customer(void *param)
{
int toeat=1+rand()%4,ate=0,t=nofCustomers;
int *id=(int*)param;
printf("Guest %d arrives and wants to eat %d food\n", id, toeat);
while(1)
{
/* aquire the full lock */
sem_wait(&full);
if(remove_item())
{
fprintf(stderr, "Consumer report error condition\n");
}
else
{
ate++;
printf("Guest %d eats a tandoori chicken[%d/%d]\n", id,ate,toeat);
}
if(ate==toeat)
{
nofCustomers--;
printf("Guest %d finishes and exits\n",id);
}
if(nofCustomers==0)
{
printf("All guests finish eating and exit\n");
break ;
}
/* signal empty */
sem_post(&empty);
sleep(toeat);
}
}
INC臨界區
/* Cook food */
int insert_item()
{
/* When the item is not full,cook food
increment the item*/
if(item <= nofChicken)
{
item++;
printf("Chef cooks one tandoori chicken.[%d/%d]\n",item,nofChicken);
return 0;
}
else
{ /* Error the items are full */
return -1;
}
}
DEC臨界區
/* Eat food */
int remove_item() {
/* When the items is/are cooked, eat the item
i.e.., decrement the item */
if(item > 0)
{
item--;
return 0;
}
else { /* Error no items */
return -1;
}
}
主要功能在BOVE CODE
你可以嘗試運行GDB中的代碼來準確找到段錯誤發生的位置嗎? – Matt
按照建議使用gdb查找精確的seg斷層線。但對於初學者:'info-> id = i;'會導致seg故障,因爲info是一個未初始化的指針。其他錯誤包括將相同的'info'指針傳遞給所有線程,這意味着每個線程都會看到一個隨機值'info-> id',並且'main'在退出之前不會等待線程完成('pthread_join')。 – kaylum
歡迎來到Stack Overflow!爲了幫助人們回答您的問題,您需要更加具體地瞭解錯誤。請[編輯]您的帖子以合併您運行[mcve]時獲得的確切堆棧跟蹤(最好使用複製+粘貼以避免轉錄錯誤)。 –