передача аргументов в _beginthread () - что не так? - PullRequest
5 голосов
/ 03 июля 2010

У меня есть этот код, и я не получаю ожидаемых результатов ... что не так?

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 ]

5 голосов
/ 03 июля 2010

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 должно быть всеми заглавными буквами.

0 голосов
/ 03 июля 2010

ваша переменная arg является локальной переменной в вашей функции foo, поэтому она не будет доступна в памяти после завершения функции.

Так что вы можете сделать две вещи:

1. Определите вашу переменную arg глобально.

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

или вы также можете выделить память для аргументов в помощь, как объяснил Касабланка.

Спасибо Alok.Kr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...