【问题标题】:passing arguments to _beginthread() -- whats wrong?将参数传递给 _beginthread() - 怎么了?
【发布时间】:2011-03-11 06:52:34
【问题描述】:

我有这段代码,但我没有得到预期的结果……怎么了?

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);
} 

【问题讨论】:

    标签: c multithreading struct arguments


    【解决方案1】:

    arg 是在foo 中定义的局部变量 - 一旦该函数结束,它将被销毁,但在另一个线程中运行的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 应该全部大写。

    【讨论】:

    • @Casablanca ,我想你打错了。句柄 = (HANDLE) _beginthread(myFunc, 0, (void*) args); /// 它的 arg 感谢 Alok.kr.
    • 你不应该将stacksize声明为非零吗?
    • @bobobobo:堆栈大小为零意味着线程将获得默认堆栈大小。
    【解决方案2】:

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

    所以你可以做两件事:

    1. 全局定义 arg 变量。

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

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

    谢谢 Alok.Kr.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多