将参数传递给_beginthreadex

时间:2011-05-11 17:16:09

标签: c++ windows multithreading

我正在尝试使用_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 个答案:

答案 0 :(得分:7)

你的代码中有两个错误,它们都与线程函数的参数无关--- NULL就好了,正如你猜测的那样。

问题在于线程函数的签名,而你得到的错误指出了这一点。首先,它必须是__stdcall函数,其次它必须返回unsigned int。您的函数为__cdecl并返回void

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

应该为你解决问题。

答案 1 :(得分:4)

显然在你的代码中你没有传递任何参数。要传递变量,您必须执行以下操作(例如):

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

答案 2 :(得分:1)

您通过第四个参数传递数据。这会将指针传递给i

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

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

请注意,我在此处使用的线程函数签名与您使用的不同:我返回unsigned并使用__stdcall调用约定 - 这是签名_beginthreadex期望的。

根据您的尝试,VC ++中的新Concurrency Runtime功能可能比显式管理您自己的线程更简单。

编辑以回复问题编辑:

您可以传递任何有效的void指针,包括NULL。如果你这样做,你甚至可以省略参数的名称,因为你没有使用它:

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

_beginthreadex(0, 0, thread, 0, 0, 0);

答案 3 :(得分:0)

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传递给函数MyThread() 请注意X,因为它最好由malloc或new分配。在使用线程连接

之前,不要在堆栈上创建它

答案 4 :(得分:0)

_beginthreadex的参数必须是具有__stdcall调用约定的函数。您的函数有__cdecl。在正确的位置简单插入__stdcall可以解决问题。

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