c++ - 如何在不使用 C++11 线程的情况下使用仿函数作为线程函数在 Windows 中开始线程?

标签 c++ windows multithreading winapi

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

相关文章:

c++ - C++ 中的可变仿函数可以支持命名字段吗?

windows - 前置到标准输入

windows - Amazon EC2 + Windows Server 2008 + Memcached = 怎么样?

c# - 为绑定(bind)列表/跨线程和锁定问题异步添加值

c++ - vector::clear() 花这么多时间?

c++ - 什么是类型字段

c# - 仅包含接口(interface)的 WinRT 组件 DLL?

c++ - DLL 如何解析它的 IAT?

Python线程: Are arguments passed to thread evaluated in parallel?

java - JTabbedPane+多线程 : Open tab in a new thread