Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多个POSIX线程_C_Multithreading_Pthreads - Fatal编程技术网

C 多个POSIX线程

C 多个POSIX线程,c,multithreading,pthreads,C,Multithreading,Pthreads,我有一个家庭作业的问题,我现在被困在上面。问题的参数如下。 1.)它必须接受来自用户的总共5个整数 2.)它必须有三个线程,每个线程执行不同的函数(平均、最小和最大) 我遇到的问题是声明一个包含5个元素的全局数组空数组,然后修改这些元素。每次我以一个错误告终,告诉我我做得不对。顺便说一下,语言是C,而不是C++(我不允许使用它)。如果有人能帮助我理解问题所在,我将不胜感激。另外,如果它是重复的(我看了,我所看到的都没有解决这些问题),请给我指出问题或文章的地址,谢谢 代码: #包括 #包括 vo

我有一个家庭作业的问题,我现在被困在上面。问题的参数如下。 1.)它必须接受来自用户的总共5个整数

2.)它必须有三个线程,每个线程执行不同的函数(平均、最小和最大)

我遇到的问题是声明一个包含5个元素的全局数组空数组,然后修改这些元素。每次我以一个错误告终,告诉我我做得不对。顺便说一下,语言是C,而不是C++(我不允许使用它)。如果有人能帮助我理解问题所在,我将不胜感激。另外,如果它是重复的(我看了,我所看到的都没有解决这些问题),请给我指出问题或文章的地址,谢谢

代码:

#包括
#包括
void*avgWorker(int in[]);
void*minWorker(int in[]);
void*maxWorker(int in[]);
内部主(空)
{
int it,*输入;
[5]中的int;
pthread_t tid1、tid2、tid3;
pthread_attr_t attr1、attr2、attr3;
for(it=0;it<5;+it)
{
printf(“请输入数字%d,共5\n”,(它+1));
输入[it]=scanf(“%d”);
}
pthread_attr_init(&attr1);
pthread_attr_init(&attr2);
pthread_attr_init(&attr3);
pthread_create(&tid1,&attr1,avgWorker(in),NULL);
pthread_create(&tid2,&attr2,minWorker(in),NULL);
pthread_create(&tid3,&attr3,maxWorker(in),NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
返回0;
}
void*avgWorker(int in[]中)
{
整数总计,平均值,it;
总数=0;
for(it=0;it<5;+it)
{
总计+=单位为[单位];
}
平均值=0;
平均值=总数/5;
printf(“\n平均值为:%d.\n”,平均值);
}
void*minWorker(int在[]中)
{
int min,it;
最小值=99999;
for(it=0;it<5;+it)
{
如果(在[it]最大值中)
max=in[it];
}
printf(“最大值为:%d\n”,max);
}

最后,我使用gcc编译这段代码,并使用-lpthread标志。再次感谢您提供的帮助。

这是它应该崩溃的地方:

input[it] = scanf("%d");
scanf
返回读取的字段数,而不是读取的数据。存储数据的变量地址应作为参数传递。像这样:

scanf("%d", &input[it]);

另外,
input
只是一个未初始化的指针。它没有指向任何地方(有意义)。我想你想要的是
输入
,而不是
输入
。您根本不需要
输入变量。

您的问题就在眼前

input[it] = scanf("%d");
查找
scanf
的语法。。。您需要提供存储数据的地址,以便

scanf("%d", input+it);
这应该是一个进步。或者-正如@dreamlax所指出的,为了获得更可读的代码

scanf("%d", &input[it]);

它编译吗?(在每个警告都打开的情况下!)您应该始终使用至少
-Wall
运行gcc。如果您想要真正干净的代码,请添加
-Wextra
,并添加
-Werror
以强制您注意其警告。请看,我相当肯定,如果
scanf
的参数数量不正确,您将收到警告。谢谢!我不熟悉命令行编译,这非常有帮助。问题是您使用的scanf参数错误。阅读scanf文档。在
vs
input
issue中的
捕捉得很好。。。!虽然相当,但出于某种原因,我发现
&input[it]
更容易阅读。@dreamlax-fair point。我会更新我的答案,包括你的建议。
scanf("%d", &input[it]);