3

スレッドの抽象化 (Windows API の POSIX スレッドとスレッド) を開発しようとしていますが、関数ポインターではなくメソッド ポインターでそれらを開始できるようにしたいと考えています。

私がやりたいのは、純粋仮想メソッド「runThread」を持つクラスであるスレッドの抽象化です。これは、将来のスレッド化されたクラスに埋め込まれます。

Windows スレッドについてはまだわかりませんが、POSIX スレッドを開始するには、メソッド ポインターではなく、関数ポインターが必要です。そして、メソッドをインスタンスに関連付けて関数として機能させる方法を見つけることができません。おそらくキーワードが見つからないだけです(そして私はたくさん検索してきました)、それはBoost::Bind()が行うこととほぼ同じだと思うので、存在するに違いありません。

手伝って頂けますか ?

4

4 に答える 4

9

これをしないでください。を使用しboost::threadます。

を使用すると、boost::thread署名の任意のファンクターでスレッドを開始できるため、次のようにandvoid()を使用できます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あり、非常に使いやすいです。

于 2010-12-21T20:37:17.240 に答える
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();
  }
}
于 2010-12-21T20:46:25.230 に答える
1

スレッド化には C++ API が必要です。boost::thread のようなもの (これは、新しい C++ に含まれる API とほとんど同じです)。OS スレッド API は一般に C で記述されており、非静的メンバ関数ポインタやファンクタ (boost::bind が作成するもの) をそれらに渡すことはできません。

于 2010-12-21T20:36:19.547 に答える
0

まあ、それは実際には演習であり、私には何も使用する権利がありません (Boost でさえも)。もちろん、私はそのようにする必要はありません (スレッドの抽象化を開発するだけでよいのです)。単に SFML のスレッドの抽象化を使用したことがあり、とても気に入りました。それに対処するのはとてもセクシーな方法です。

フェルッチョのやり方が良さそう!work() メソッドが純粋な仮想である場合、スレッドの抽象化を実装する任意のクラスに実装できます...そしてそれはうまく機能しますよね? (そうなるかどうかはよくわかりませんが、私のC++の基本的な知識によると、そうすべきだと思いますか?)

于 2010-12-22T13:28:54.670 に答える