0

我想做一个线程对象,可以覆盖成员函数“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 正在检查问题的解决方案”

它没有编译错误。

4

3 回答 3

1

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

于 2013-07-03T08:55:20.223 回答
0

从析构函数中移除 _endthread。

MSDN:您可以显式调用 _endthread 或 _endthreadex 来终止线程;但是,当线程从作为参数传递给 _beginthread 或 _beginthreadex 的例程返回时,会自动调用 _endthread 或 _endthreadex。通过调用 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;
}
于 2013-07-03T09:55:32.897 回答
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 中)通常比普通程序员实现得更好,而且它肯定比自己编写一个好的实现节省了很多时间。

于 2013-07-03T10:19:07.810 回答