将参数传递给_beginthread() - 什么是错的?

时间:2010-07-02 20:46:11

标签: c multithreading struct arguments

我有这个代码而且我没有得到预期的结果......什么是错的?

typedef struct {
   int data1;
   int data2;
}t;

void foo(int a, int b) {

   Handle handle;
   t arg;
   arg.data1 = a;
   arg.data2 = b;
   handle = (HANDLE) _beginthread( myFunc, 0, (void*) &arg);
}

void myFunc(void *param) {
   t *args = (t*) param;
   int x = args->data1;
   int y = args->data2;
   printf("x=%d, y=%d\n", x, y);
} 

2 个答案:

答案 0 :(得分:5)

argfoo中定义的局部变量 - 一旦该函数结束就会被销毁,但是在另一个线程中运行的myFunc仍然会尝试访问它。你应该在堆上分配arg并在完成后在线程中销毁它。

void foo(int a, int b) {
   HANDLE handle;
   t *arg;
   arg = (t *)malloc(sizeof(t));
   arg->data1 = a;
   arg->data2 = b;
   handle = (HANDLE) _beginthread( myFunc, 0, (void*) arg);
}

void myFunc(void *param) {
   t *args = (t*) param;
   int x = args->data1;
   int y = args->data2;
   printf("x=%d, y=%d\n", x, y);
   free(args);
}

另请注意,HANDLE应为全部上限。

答案 1 :(得分:0)

你的arg变量是函数foo中的局部变量,因此在函数结束后它不会在内存中可用。

所以你可以做两件事:

1.全局定义你的arg变量。

typedef struct {
   int data1;
   int data2;
}t;
t arg;

或者您也可以在帮助中为arg分配内存,正如卡萨布兰卡所解释的那样。

由于 Alok.Kr。