c中的生产者-消费者程序-分段错误(核心转储)

c中的生产者-消费者程序-分段错误(核心转储),c,C,嗨,我对C编程有点陌生。面对生产者和消费者的问题。当我尝试运行下面的代码时,我会遇到分段错误(内核转储)。请告诉我哪里出了问题。但此代码适用于一个使用者,但对于多个使用者,它会抛出错误 代码: #包括 #包括 #包括 #定义最大值20 #定义MAXNTHREADS 5 作废*产生(作废*参数); 作废*消耗(作废*参数); /*线程共享的全局*/ int nitems=MAXNITEMS;/*生产者和消费者只读*/ int buff[MAXNITEMS]; 内部信号; 结构{ pthread_m

嗨,我对C编程有点陌生。面对生产者和消费者的问题。当我尝试运行下面的代码时,我会遇到分段错误(内核转储)。请告诉我哪里出了问题。但此代码适用于一个使用者,但对于多个使用者,它会抛出错误

代码:

#包括
#包括
#包括
#定义最大值20
#定义MAXNTHREADS 5
作废*产生(作废*参数);
作废*消耗(作废*参数);
/*线程共享的全局*/
int nitems=MAXNITEMS;/*生产者和消费者只读*/
int buff[MAXNITEMS];
内部信号;
结构{
pthread_mutex_t mutex;
int buff[MAXNITEMS];
int nput;/*要存储的下一个索引*/
int nval;/*要存储的下一个值*/
}put={PTHREAD_MUTEX_INITIALIZER};
/**struct put仅由生产者使用***/
结构{
pthread_mutex_t mutex;
pthread_cond_t cond;
int nready;/*已为消费者准备好号码*/
}nready={PTHREAD_MUTEX_初始值设定项,PTHREAD_COND_初始值设定项,0};
int main(int argc,字符**argv)
{
int i、prod、con;
pthread_t tid_产生[MAXNTHREADS],tid_消耗[MAXNTHREADS];
printf(“输入生产者的数量:\n”);
scanf(“%d”和&prod);
printf(“输入用户数量:\n”);
scanf(“%d”和“con”);
/*创建所有生产者和消费者*/
对于(i=0;i=nitems){
pthread_mutex_unlock(&put.mutex);
return(NULL);/*数组已满,完成*/
}
put.buff[put.nput]=put.nval;
printf(“生产者%lu产生:%d\n”,pthread_self(),put.buff[put.nput]);
put.nput++;
put.nval++;
printf(“外部生产者锁”);
pthread_mutex_unlock(&put.mutex);
*((int*)arg)+=1;
}
}
作废*消耗(作废*参数)
{
int i;
对于(i=0;i
*((int*)arg)+=1
内部
产生(…)
导致
分段错误
。因为
pthread\u create(&tid\u product[i],NULL,product,NULL)
NULL
作为
arg
传递

// main
int i, prod, con;
pthread_t tid_produce[MAXNTHREADS],  tid_consume[MAXNTHREADS];
int p_arg[MAXNTHREADS]; // <======
// ...
for (i = 0; i < prod; i++)
{
    pthread_create(&tid_produce[i], NULL,produce, p_arg+i); // <====
}
因此,我们需要为
arg
分配一些内存

// main
int i, prod, con;
pthread_t tid_produce[MAXNTHREADS],  tid_consume[MAXNTHREADS];
int p_arg[MAXNTHREADS]; // <======
// ...
for (i = 0; i < prod; i++)
{
    pthread_create(&tid_produce[i], NULL,produce, p_arg+i); // <====
}
//main
int i、prod、con;
pthread_t tid_产生[MAXNTHREADS],tid_消耗[MAXNTHREADS];

int p_arg[MAXNTHREADS];//定义
结构
时,请始终包含
标记名
,因为大多数调试器都使用它来列出结构中的各个字段struct@user3629249它确实可以编译。但是,您仍然认为代码很难阅读。这一行:
struct
应该是:
structStructTag
这一行:
}put={PTHREAD\u MUTEX\u INITIALIZER}
应该更像:
};struct structTag put{.mutex=PTHREAD\u mutex\u INITIALIZER}类似的注意事项应适用于
结构nready
是否干净编译取决于您使用的编译器和使用的选项。由于OP应该使用复杂的选项,因此编译器可以识别尽可能多的问题,所以说“它不在基线选项下编译,例如
gcc-Wall-Wextra-Werror…
”,这并不是完全不合理的。用更少的东西编译是不明智的;你可能会犯太多的错误,这些错误会被那些选项发现。就个人而言,我需要比这更严格的选项——尽管结果差异很小。代码没有检查
prod
con
的输入值是否正常。如果数字小于1或大于MAXNTHREADS,则应报告一个错误(可能会退出)。不要忘记初始化
p\u narg
数组。