0

我正在为 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 线程

4

1 回答 1

1

标准技术如下:

  • 定义一个结构来保存您需要传递给线程的任何信息。在您的情况下,该信息是可调用函子。所以,你手头已经有了一个合适的结构。
  • 在堆上分配这些结构之一。这发生在调用线程中,但信息被传递给创建的线程,这就是它不能存在于堆栈上的原因。
  • 调用CreateThread传递一个合适的线程过程(稍后更多),以及lpParameter参数中结构的地址。
  • 在线程 proc 中,您将获得结构体的地址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++。

于 2013-10-29T16:17:14.933 回答