我尝试测试Linux pthread
。我创建多线程,在每个线程中,我通过thread_arg struct
传递一些参数。在我传递给线程函数之前,我打印出来,一切正常。当这个参数传递给线程函数时,我再次打印出来,我看到参数中的值不像以前那样保持不变。
这是我的代码:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
typedef struct {
int paramA;
int paramB;
} thread_arg;
void* message(void* argObj) {
thread_arg* arg = (thread_arg*) argObj;
printf("Test2: %d &&& %d\n", arg->paramA, arg->paramB);
return NULL;
}
void Func(int id, int num) {
// run num-th thread.
int i;
for (i = 1; i <= num; i++) {
// start a new thread
pthread_t thread;
// printf("thread with: %d and %d\n", id, i);
// thread_arg arg = {.studentId = id, .questionId = i};
thread_arg arg;
arg.paramA = id;
arg.paramB = i;
printf("test 1: %d &&& %d\n", arg.paramA, arg.paramB);
pthread_create(&thread, NULL, &message, &arg);
}
}
int main() {
int i;
for(i=0;i<1;i++) {
Func(i, 3);
}
while (1);
return 0;
}
结果是:
test 1: 0 &&& 1 // normal
test 1: 0 &&& 2 // normal
test 1: 0 &&& 3 // normal
Test2: 0 &&& 3 // strange error
Test2: 0 &&& 3 // strange error
Test2: 0 &&& 3 // strange error
这很奇怪,因为测试2上的三行应该包含所有数字1 2和3。
我无法解释为什么会出现这种情况。请解释一下。
谢谢:)
答案 0 :(得分:3)
当您使用pthread_create()
创建新主题时,您将参数的地址作为&arg
传递。这只是一个指针,指针就是你的线程收到的所有指针。当您的Func()
代码循环启动另一个线程时,您的arg
变量超出范围并被销毁。先前由arg
占用的内存用于其他内容(可能是为循环的下一次迭代创建的arg
。)
解决此问题的一种方法是分配thread_arg *parg = (thread_arg *) malloc(sizeof thread_arg);
并将parg
(指针)传递给pthread_create()
。在你完成它们之后,不要忘记在帖子中释放参数。