我正在为 Windows 编写一个简单的线程库。我想传递这个仿函数
struct callable
{
void operator()()
{
for(int i = 0; ;++i)
{
std::cout << i << std::endl;
}
}
};
在 _beginthread()
中这样:
int main()
{
callable c;
_beginthread(c, 0, 0);
}
但这是不可能的。在线程中传递仿函数的能力对于我的库来说是非常必要的。我知道 boost::thread
提供了这种能力,因此这是可能的。如何在不使用 C++11 线程的情况下使用仿函数作为线程函数在 Windows 中启动线程?
[更新] 不使用 C++11 线程
最佳答案
标准技术如下:
- 定义一个结构来保存您需要传递给线程的任何信息。在您的情况下,该信息是可调用仿函数。所以,您手边已经有了合适的结构。
- 在堆上分配这些结构之一。这发生在调用线程中,但信息会传递给创建的线程,这就是它不能存在于堆栈中的原因。
- 调用
CreateThread
并传递合适的线程过程(稍后会详细介绍)以及lpParameter
参数中的结构地址。 - 在线程过程中,您将在
lpParameter
中传递结构的地址。 - 将该指针转换为适当的类型并调用您的仿函数。
- 删除堆分配的内存。
线程过程如下所示:
DWORD WINAPI ThreadProc(void *lpParameter)
{
callable *c = (callable*)lpParameter;
(*c)();
delete c;
return 0;
}
CreateThread
的调用是沿着这些行进行的:
callable *c = new callable;
// initialise c
CreateThread(NULL, 0, ThreadProc, (void*)c, 0, &threadID);
如果这里有语法错误,我深表歉意,我对 C++ 一点也不流利。
关于c++ - 如何在不使用 C++11 线程的情况下使用仿函数作为线程函数在 Windows 中开始线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19663217/