C++ 类内线程虚拟成员函数

C++ 类内线程虚拟成员函数,c++,multithreading,class,overriding,virtual-functions,C++,Multithreading,Class,Overriding,Virtual Functions,我想做一个线程对象,成员函数“run”可以被重写。当我添加“虚拟”一词时,它将失败。有人能帮我吗?我如何制作线程对象。对象可以被继承,成员函数可以被重写 #include <iostream> #include <process.h> using namespace std; class thread { private: static void gangplank(void *ptr) { ((thread *)ptr)->run

我想做一个线程对象,成员函数“run”可以被重写。当我添加“虚拟”一词时,它将失败。有人能帮我吗?我如何制作线程对象。对象可以被继承,成员函数可以被重写

#include <iostream>
#include <process.h>
using namespace std;

class thread
{
private:
    static void gangplank(void *ptr)
    {
        ((thread *)ptr)->run();
    }
public:
    void start()
    {
        _beginthread(&this->gangplank,0,(void *)this);
        //this->gangplank((void *)this);
    }
    virtual void run()
    {
        cout<<1;
    }
    ~thread()
    {
        _endthread();
    }
};


class d:public thread
{
public:
    void run()
    {
        cout<<2;
    }
};

int main()
{
    d a;
    a.start();

    return 0;
}
#包括
#包括
使用名称空间std;
类线程
{
私人:
静态空隙跳板(空隙*ptr)
{
((线程*)ptr)->run();
}
公众:
void start()
{
_beginthread(&this->跳板,0,(void*)this);
//此->跳板((空*)此);
}
虚拟空运行()
{

我不知道这是不是你的问题,因为你只是说这是你的问题 失败,没有说明如何失败,但您不必等待线程停止 在
main
中完成,因此您可能正在破坏线程对象
在线程开始运行之前。

从析构函数中删除endthread

MSDN: 您可以显式调用_endthread或_endthreadex来终止 线程;但是,会自动调用_endthread或_endthreadex 当线程从作为参数传递给的例程返回时 _beginthread或_beginthreadex。通过调用endthread或_endthreadex终止线程有助于确保正确恢复资源 分配给线程的

好的,我现在明白了,_endthread在析构函数中,这里不是真正的问题,您必须在主函数中等待线程

#include <process.h>
#include <iostream>

using namespace std;

class thread
{
private:
    HANDLE m_handle;
    static void gangplank(void *ptr)
    {
        ((thread *)ptr)->run();
    }
public:
    HANDLE getHandle() const {return m_handle;}
    void start()
    {
        m_handle = (HANDLE)_beginthread(&this->gangplank,0,(void *)this);       
    }
    virtual void run()
    {
        cout<<1;
    }
    ~thread()
    {
        //_endthread();
    }
};


class d:public thread
{
public:
    void run()
    {
        cout<<2;
    }
};

int main()
{
    d a;
    a.start();
    WaitForSingleObject(a.getHandle(), INFINITE);
    return 0;
}
#包括
#包括
使用名称空间std;
类线程
{
私人:
手柄m_手柄;
静态空隙跳板(空隙*ptr)
{
((线程*)ptr)->run();
}
公众:
HANDLE getHandle()常量{return m_HANDLE;}
void start()
{
m_handle=(handle)_beginthread(&this->gangplank,0,(void*)this);
}
虚拟空运行()
{

不能使用
std::thread
而不是本机C API。它使用函数对象,因此您可能甚至不需要虚拟函数。如果您的编译器不支持C++11,则可以使用几乎相同的
boost::thread
(实际上,它直接使用本机API)

以下是一个例子:

#include <thread>
#include <iostream>

void run()
{
  std::cout << "run" << std::endl;
}

int main()
{
  std::thread t(run);
  t.join();
}
#包括
#包括
无效运行()
{
std::cout当您说“它将运行失败”是什么意思?您会得到什么错误?错误消息是“text.exe已停止工作-Windows正在检查问题的解决方案”
#include <thread>
#include <functional>
#include <iostream>

class A {
public:
void run()
    {
        std::cout << "run" << std::endl;
    }
};

int main()
{
    A a;
    std::thread t(std::bind(&A::run, &a));
    t.join();
}