1
我正在尝试编写一小段代码,使得使用CreateThread()稍微更干净一些。我不能说我真的打算使用它,但我认为这对于像我这样的新程序员来说是一个有趣的小项目。以下是我迄今为止:将函数作为参数传递以简化线程创建
#include <iostream>
#include <windows.h>
using namespace std;
void _noarg_thread_create(void(*f)())
{
cout << "Thread created...\n" << endl;
Sleep(10);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)f, NULL, 0, NULL);
}
template <typename T>
void _arg_thread_create(void(*f)(T), T* parameter)
{
cout << "Thread created...\n" << endl;
Sleep(10);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)*f, parameter, 0, NULL);
}
void printnums(int x)
{
for(int i = x; i < 100; i++)
{
cout << i << endl;
}
}
void printnumsnoarg()
{
for(int i = 0; i < 100; i++)
{
cout << i << endl;
}
}
int main()
{
cin.get();
_noarg_thread_create(&printnumsnoarg);
cin.get();
int x = 14;
_arg_thread_create(&printnums, &x);
cin.get();
}
基本上我有两个功能,将调用两个不同的预设,CreateThread的:一个当需要在线程参数,和一个当需要在没有参数线。我可以用g ++编译器(cygwin)编译,并且运行时没有任何错误。第一个线程得到正确创建,并按预期输出数字0-99。但是,第二个线程不会打印出任何数字(使用此代码,它应该打印14-99)。我的输出如下所示:
<start of output>
$ ./a.exe
Thread created...
0
1
2
3
.
.
.
97
98
99
Thread Created...
<end of output>
任何想法为什么第二个线程不能正常工作?
您传递给'CreateThread'的函数应该有'DWORD WINAPI(LPVOID)'签名。你似乎忽略了这一点。 – chris 2013-03-05 21:17:19
也许是因为'_noarg_thread_create'首次调用'cin.get();'之后?第二件事:C++现在有一个很好的[std :: thread](http://en.cppreference.com/w/cpp/thread/thread)。我认为,使用它会更好 – borisbn 2013-03-05 21:22:46