Передача параметров в _beginthreadex - PullRequest
1 голос
/ 11 мая 2011

Я пытаюсь выполнить некоторое базовое распараллеливание, используя _beginthreadex и передавая параметры в соответствии с приведенным мной примером, но это не сработает.

Есть идеи?

#include <iostream> 
#include <process.h>



void MyThread(void *data)
{
    std::cout << "Hello World!"; 
}

int main()
{
    _beginthreadex(NULL, 0, MyThread, NULL, 0, NULL); 
    while(true);
}

РЕДАКТИРОВАТЬ:

Почему передача NULL в качестве аргумента не работает? (Так как функция все равно не принимает аргументов?)

Передача NULL в качестве списка аргументов прекрасно работала с _beginthread.

Ответы [ 5 ]

7 голосов
/ 12 мая 2011

В вашем коде есть две ошибки, ни одна из которых не связана с параметром функции потока --- NULL хорошо для этого, как вы и предполагали.

Проблемы заключаются в сигнатурефункции потока, и ошибка, которую вы получаете, указывает на это.Во-первых, это должна быть функция __stdcall, а во-вторых, она должна возвращать unsigned int.Ваша функция - __cdecl и возвращает void.

unsigned __stdcall MyThread(void *data)
{
    std::cout << "Hello World!"; 
    return 0;
}

должна решить проблему для вас.

5 голосов
/ 11 мая 2011

очевидно, что в вашем коде вы не передаете ни одного параметра. Чтобы передать переменную, вы должны сделать следующее (например):

#include <iostream> 
#include <process.h>

void MyThread(void *data)
{
    int x = static_cast<int*>(data);
    std::cout << "Hello World! " << x; 
}

int main()
{
    int x = 10;
    _beginthreadex(NULL, 0, MyThread, &x, 0, NULL); 
    while(true);
}

ОБНОВЛЕНИЕ: Поскольку вы опубликовали проблему компиляции позже: очевидно, вашей функции потока необходимо вернуть целое число:

int MyThread(void *data)
{
    std::cout << "Hello World!"; 
    return 0;
}
1 голос
/ 11 мая 2011

Вы передаете свои данные через четвертый параметр.Это передает указатель на i:

unsigned __stdcall thread(void *arg)
{
    int *iptr = (int*)arg;
    ...
}

int i;
_beginthreadex(0, 0, thread, &i, 0, 0);

Обратите внимание, что подпись функции потока, которую я здесь использовал, отличается от используемой вами: я возвращаю unsigned и использую соглашение о вызовах __stdcall -это подпись, которую _beginthreadex ожидает.

В зависимости от того, что вы пытаетесь сделать, новые функции Concurrency Runtime в VC ++ могут быть проще в использовании, чем явное управлениеВаши собственные потоки.

Редактировать в ответ на редактирование вопроса:

Вы можете передать любой действительный указатель void, включая NULL.Если вы сделаете это, вы даже можете пропустить имя параметра, поскольку вы его не используете:

unsigned __stdcall thread(void*)
{
    ...
}

_beginthreadex(0, 0, thread, 0, 0, 0);
0 голосов
/ 11 мая 2011

Аргументом _beginthreadex должна быть функция с __stdcall соглашением о вызовах. Ваша функция имеет __cdecl. Простая вставка __stdcall в правильном месте должна решить проблему.

void __stdcall MyThread(void *data)
{
    std::cout << "Hello World!"; 
}
0 голосов
/ 11 мая 2011

The fourth parameter in _beginthreadex(NULL, 0, MyThread, NULL, 0, NULL) are arguments to the function MyThread

Прямо сейчас вы передаете ему значение NULL, поэтому void* data должен получить указатель NULL

struct X  
{  
    int a;  
    int b;  
};

X* x = (X*)malloc(sizeof(X));  

x->a = 5;  
x->b = 6;  
_beginthreadex(NULL, 0, MyThread, NULL, x, NULL);

Приведенный выше код передаст указатель x вfunction MyThread().
Позаботьтесь о X, так как его лучше распределять по malloc или new.Не создавайте его в стеке, пока не используете соединение потоков

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