【问题标题】:non- static function to create the thread创建线程的非静态函数
【发布时间】:2013-08-22 18:51:00
【问题描述】:

我正在.NET 中创建可在服务器端使用的应用程序。我的应用程序也有 C++ 部分。在其中一个 c++ 类中,我需要创建一个线程,该线程应该贯穿对象的生命周期。 我正在使用 CreateThread 函数来创建新线程。

问题是,它需要一个静态函数作为参数来运行线程。由于我想将它部署在服务器端,我不想使用静态函数用于线程。我想使用要用于此方法的对象的成员函数。

有没有更好的方法来创建线程

【问题讨论】:

    标签: .net multithreading visual-studio-2010 visual-c++


    【解决方案1】:

    你不能将成员函数指针传递给CreateThread,但你可以传递一个非成员函数来转发给成员函数。

    您可以将参数传递给CreateThread,该参数将传递给您的函数。使用它来传递你的类的实例:

    struct foo
    {
        void thread_func();
    
        static DWORD CALLBACK thread_func_thunk(void *arg)
        {
            ((foo*)arg)->thread_func();
        }
    };
    
    foo fooinst;
    CreateThread(nullptr, 0, foo::thread_func_thunk, (void*)&fooinst, 0, nullptr)
    

    【讨论】:

    • +1,尽管 'thread_func_thunk' :) foo 可以是抽象的,然后你可以在你的继承链中添加 foo,实现你想要的 thread_func(),尽管你应该称之为'Task',等)。
    • 我有一个疑问,这个线程假设贯穿创建它的对象的整个生命周期。在此期间,如果另一个对象访问 thread_func_thunk 函数,会不会造成任何问题,或者两个创建的线程会安全地并行运行?
    • 我发布的整个示例都是线程安全的。让thread_func 安全和/或使用单独的实例调用它取决于您。
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多