类虚拟成员函数中的线程

时间:2013-07-03 08:42:57

标签: c++ multithreading class override virtual-functions

我想制作一个线程对象,可以覆盖成员函数“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;
}

错误消息:

  

“text.exe已停止工作 - Windows正在检查问题的解决方案”

它没有编译错误。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

从析构函数中删除_endthread。

  

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

好的,我现在得到它,_endthread在析构函数中这不是真正的问题,你必须等待main函数中的线程。

#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;
}

答案 2 :(得分:0)

使用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();
}

或者您也可以致电班级成员:

#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();
}

通常建议尽可能使用更高级别的API,而不是自己创建C库调用的包装器。 C ++标准中的API(通常也在Boost中)通常比普通程序员更好地实现,并且它确实比自己实现良好的实现节省了大量时间。