我正在尝试使用_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一起正常工作。
答案 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!";
}