C:pthread:在thread参数中值不相同

时间:2014-04-14 03:00:52

标签: c pthreads

我尝试测试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。

我无法解释为什么会出现这种情况。请解释一下。

谢谢:)

1 个答案:

答案 0 :(得分:3)

当您使用pthread_create()创建新主题时,您将参数的地址作为&arg传递。这只是一个指针,指针就是你的线程收到的所有指针。当您的Func()代码循环启动另一个线程时,您的arg变量超出范围并被销毁。先前由arg占用的内存用于其他内容(可能是为循环的下一次迭代创建的arg。)

解决此问题的一种方法是分配thread_arg *parg = (thread_arg *) malloc(sizeof thread_arg);并将parg(指针)传递给pthread_create()。在你完成它们之后,不要忘记在帖子中释放参数。