ser*_*buj 1 c parameters struct pthreads
我有这段代码给我带来了麻烦.我知道所有线程都在读取相同的结构.但我不知道如何解决这个问题.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a,b;
} s_param;
void *
threadfunc(void *parm)
{
s_param *param2 = parm;
printf("ID:%d and v:%d\n",param2->a,param2->b);
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
pthread_t thread[3];
int rc=0,i;
void * status;
for(i=0; i<3 ; ++i){
s_param param;
param.b=10;
param.a=i;
rc = pthread_create(&thread[i], NULL, threadfunc, ¶m ); // !!!!
if(rc){
exit(1);
}
}
for(i=0; i<3 ; ++i){
pthread_join(thread[i],&status);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
ID:2 and v:10
ID:2 and v:10
ID:2 and v:10
Run Code Online (Sandbox Code Playgroud)
我需要什么:
ID:0 and v:10
ID:1 and v:10
ID:2 and v:10
Run Code Online (Sandbox Code Playgroud)
for循环中的sparam的范围在该循环中是静态的.当您设置.a和.b时,您反复写入相同的结构,并且所有三个线程都获得指向同一个结构的指针.
相反,您可以通过创建它们的数组来创建结构的三个单独实例.
int main(int argc, char **argv)
{
pthread_t thread[3];
s_param param[3];
int rc=0,i;
void * status;
for(i=0; i<3 ; ++i){
param[i].b=10;
param[i].a=i;
rc = pthread_create(&thread[i], NULL, threadfunc, ¶m[i] ); // !!!!
if(rc){
exit(1);
}
}
... etc
Run Code Online (Sandbox Code Playgroud)
应该提一下,在这样的数组中创建结构(和线程)是可行的,因为你明确地用主线程做了一个join().如果你没有这样做,你会被建议静态地在主函数之外分配结构,或者从堆中malloc它们,因为一旦入口线程退出main函数,包含数组的堆栈框架将变得无效,并将很快以不可预测的方式被覆盖.