以唯一结构作为参数C的pthread
我有一段给我带来麻烦的代码。 我知道所有线程都在读取同一个结构。但我不知道如何解决这个问题以唯一结构作为参数C的pthread,c,parameters,struct,pthreads,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
#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;
}
我需要的是:
ID:0 and v:10
ID:1 and v:10
ID:2 and v:10
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
应该提到的是,在这样的数组中创建结构和线程是可行的,因为您显然与主线程进行了连接。如果您没有进行连接,则建议您要么在主函数外部静态分配结构,要么从堆中malloc它们,因为一旦入口线程退出主函数,包含数组的堆栈帧将变得无效,并且很快将以不可预知的方式被覆盖。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
应该提到的是,在这样的数组中创建结构和线程是可行的,因为您显然与主线程进行了连接。如果您没有进行连接,则建议您要么在主函数外部静态分配结构,要么从堆中malloc它们,因为一旦入口线程退出主函数,包含数组的堆栈帧将变得无效,并且很快将以不可预知的方式被覆盖。在主函数执行期间,param位于堆栈中的同一位置。每次设置新值时,它们都会清除旧值,并且所有threadfuncs都会在内存中查看同一点。malloc结构,或者从不同的内存位置创建它们。此外,使用堆栈内存进行跨线程数据结构也是令人担忧的;一旦在中设置它们的函数退出,内存就无效。在主函数执行期间,param位于堆栈中的同一位置。每次设置新值时,它们都会清除旧值,并且所有threadfuncs都会在内存中查看同一点。malloc结构,或者从不同的内存位置创建它们。此外,使用堆栈内存进行跨线程数据结构也是令人担忧的;一旦要在中设置它们的函数退出,内存就无效。参数是一个局部变量。它在循环的大括号末尾超出范围。您需要为每个线程malloc一个新的s_参数
或者更好,定义一个同时包含pthread_t和s_参数的结构,并将该类型用于线程[3]
param是一个局部变量。它在循环的大括号末尾超出范围。您需要为每个线程malloc一个新的s_参数
或者更好,定义一个同时包含pthread_t和s_参数的结构,并将该类型用于线程[3]
s_param*param=线程[i];应该是s_param*param=&thread[i];s_param*param=线程[i];应该是s_param*param=&thread[i];
typedef struct {
int a,b;
pthread_t t;
} s_param;
int main(int argc, char **argv)
{
s_param thread[3]; // declare threads + params together
int rc=0,i;
void * status;
for(i=0; i<3 ; ++i){
s_param *param = &thread[i]; // no persistent data declared here
param->b=10;
param->a=i;
rc = pthread_create(&thread[i].t, NULL, threadfunc, &thread[i] ); // !!!!
if(rc){
exit(1);
}
}
…