2

スレッドをサポートする小さな組み込み RTOS を使用しています。私は C++ でプログラミングしており、任意のクラスの任意のメンバー関数をスレッドとして実行できるクラスを作成したいと考えています。RTOS はメンバー関数からのスレッドの作成を直接サポートしていませんが、スレッド内から呼び出された場合は問題なく動作します。Boost::thread は私のプラットフォームでは利用できません。

私は現在、フレンドの thread_starter() 関数を介してアドホックな方法でスレッドを開始していますが、スレッドを実行したいクラスごとに、これらのうちの 1 つを個別に用意する必要があるようです。スレッド基本クラスの現在のソリューションは仮想 run() 関数を使用しますが、これには、クラスに対して 1 つのスレッドしか開始できず、run() 関数 + 順番に呼び出すものに制限されるという欠点があります (つまり、私はできません)。 run() 内から任意の関数をエレガントに実行します)

クラス「X」メンバー関数内から次のことを実行できるように、テンプレート化されたクラス「スレッド」が理想的です。

class X 
{
    run_as_thread(void* p)';
};

X x;
void* p = NULL;

template<X>
thread t(x, X::run_as_thread, p);

//somehow causing the following to be run as a thread :
x->run_as_thread(p);

これが以前にここで死んでしまった場合は申し訳ありませんが、これを達成するために Boost::thread を使用することへの参照を見つけることしかできないようで、それは私には利用できません。また、ヒープにアクセスできないため、すべてのグローバルを静的にする必要があります。

どうもありがとう、

マイク

4

4 に答える 4

2

コンパイラが C++11スレッド機能をサポートするのに十分な最新のものである場合は、それを使用できます。

多分このようなもの:

class X
{
public:
    void run(void *p);
};

X myX;
void *p = nullptr;

std::thread myThread(std::bind(&X::run, myX, p));

X::runこれで、スレッドとして実行されます。std::thread::joinスレッドが完了したときに呼び出して、その後のクリーンアップを行います。

于 2012-08-15T13:25:56.800 に答える
1

RTOSがpthreadのように機能し、C ++ 11(おそらくスレッドサポートについての仮定を行う)がないと仮定すると、この種のメカニズムを使用できますが、ポインターを受け取るクラスに静的メソッドが必要ですクラスのインスタンスに。したがって(大まかに)

class Wibble
{
  public:
    static void *run_pthread(void *me)
    {
         Wibble *x(static_cast<Wibble *>(me));
         return x->run_thread_code();
    }
  private:
    void *run_thread();
};

Wibble w;
pthread_create(&thread, &attr, Wibble::run_pthread, &w);

引数を渡すことは、読者の練習問題として残されています...

これは少しの努力でテンプレート化することができますが、それは内臓が機能する必要がある方法です。

于 2012-08-15T13:36:31.690 に答える
0

あなたが求めているのは、クラスで任意のメンバー関数を非同期的に実行する方法のようです。run()仮想関数についてのあなたのコメントからそれを取ります:

「これには、クラスに対して1つのスレッドしか開始できないという欠点があります」

...つまり、すべての関数呼び出しがそのスレッドで実行されるため、そのオプションが気に入らないということです。必要なのは、オブジェクト指向のスレッド抽象化を作成するだけでなく、個々の関数呼び出しをスレッド化する機能です。

You should look into a thread pooling library for your target platform. I can't offer any concrete suggestions given no knowledge of your actual platform or requirements, but that should give you a term to search on and hopefully get some fruitful results.

于 2012-08-15T13:41:01.770 に答える
0

非ブースト プロジェクトの無関係なクラス間での C++ コールバックの受け渡しに関する私の投稿をご覧ください

于 2012-08-15T13:38:54.307 に答える