【问题标题】:Start a thread using a method pointer使用方法指针启动线程
【发布时间】:2023-04-10 03:03:02
【问题描述】:

我正在尝试开发一个线程抽象(POSIX 线程和来自 Windows API 的线程),我非常希望它能够使用方法指针而不是函数指针来启动它们。

我想做的是将线程抽象为具有纯虚方法“runThread”的类,该类将被植入未来的线程类中。

我还不知道 Windows 线程,但是要启动一个 POSIX 线程,你需要一个函数指针,而不是一个方法指针。 而且我无法找到将方法与实例相关联的方法,以便它可以作为函数工作。 我可能只是找不到关键字(我一直在搜索很多),我认为这几乎就是 Boost::Bind() 所做的,所以它必须存在。

你能帮帮我吗?

【问题讨论】:

  • 已经完成了。请参阅 Boost::thread。如果这只是一个练习搜索stackoverflow。 PS。不,您不能使用任何 C++ 功能,回调必须是外部“C”函数。但是从那里你可以调用任何东西。

标签: c++ multithreading methods function-pointers member-function-pointers


【解决方案1】:

不要这样做。使用boost::thread

使用boost::thread,您可以使用签名void() 的任何函子启动线程,因此您可以使用std::mem_funstd::bind1st,如

struct MyAwesomeThread
{
    void operator()()
    {
        // Do something with the data
    }

    // Add constructors, and perhaps a way to get
    // a result back

private:
    // some data here
};

MyAwesomeThread t(parameters)
boost::thread(std::bind1st(std::mem_fun_ref(&t::operator()), t));

编辑:如果你真的想抽象 POSIX 线程(这并不难),你可以这样做(我把 pthread_attr 的初始化留给你)

class thread
{
    virtual void run() = 0; // private method

    static void run_thread_(void* ptr)
    {
        reinterpret_cast<thread*>(ptr)->run();
    }

    pthread_t thread_;
    pthread_attr_t attr_;

public:
    void launch() 
    {
        pthread_create(&thread_, &attr_, &::run_thread_, reinterpret_cast<void*>(this));
    }
};

boost::thread 便携、灵活且使用非常简单。

【讨论】:

    【解决方案2】:

    你真的应该使用 Boost.Thread。但是如果你不能并且启动线程的调用允许你将参数传递给你的线程函数,一个常见的习惯用法是拥有一个独立的或静态的成员函数,它将参数转换为对象指针。例如

    class Thread {
    public:
      void start() { start_thread(_work, this); }  // whatever call starts a thread
    
      void work() {} // does thread work
    
    private:
      static void _work(void* param) {
        (reinterpret_cast<Thread*>(param))->work();
      }
    }
    

    【讨论】:

      【解决方案3】:

      您需要一个用于线程的 C++ API。 boost::thread 之类的东西(这与新 C++ 中的 API 几乎相同)。操作系统线程 API 通常在 C 中,您不能将非静态成员函数指针传递给它们,也不能传递函子(这是 boost::bind 创建的)。

      【讨论】:

        【解决方案4】:

        嗯,这实际上是一种锻炼,我无权使用任何东西(甚至连 Boost 都没有)。 当然我不必那样做(我只需要开发一个线程抽象),我只是想:我曾经使用过 SFML 线程抽象,我很喜欢它。这是一种很性感的处理方式。

        Ferruccio 的方式似乎不错! 如果 work() 方法是纯虚拟的,那么它可以在任何实现线程抽象的类中实现......它会工作得很好,对吧? (我不太确定会不会,但根据我对C++的基本知识,我想应该会吧?)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 2013-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          相关资源
          最近更新 更多