将parameter passing给_beginthreadex

我正在尝试使用_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工作正常。

Solutions Collecting From Web of "将parameter passing给_beginthreadex"

你的代码中有两个错误,这两个错误都不涉及线程函数的参数— NULL是正确的,正如你猜测的那样。

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

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

应该为你解决问题。

显然在你的代码中你没有传递任何参数。 要传递一个变量,你必须做下面的事情(例如):

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

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

 unsigned __stdcall thread(void *arg) { int *iptr = (int*)arg; ... } int i; _beginthreadex(0, 0, thread, &i, 0, 0); 

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

取决于你想要做什么,VC ++中的新并发运行时功能可能比显式管理自己的线程更简单。

编辑回答问题编辑:

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

 unsigned __stdcall thread(void*) { ... } _beginthreadex(0, 0, thread, 0, 0, 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分配。 在使用线程连接之前,不要在堆栈上创建它

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

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