0

スレッドとして実行する必要がある関数を含むクラスがあります。これを行う適切な方法 (私が理解している形式) は、これらの関数を static として宣言することです。このクラスのメソッドを使用するには、そのクラスのインスタンスが必要なので、コンストラクターで自己に初期化される静的変数を作成します。効率性とプログラム ロジックにどのような影響がありますか?

class Foo
{
   private: Foo* this_instance;
   Foo()
   {
      this_instance=this;
   }

   void FooBar()
   {
   ...
   }

   static void* Bar()
   {
   if (this_instance==NULL) return 1; //throws are not catched are they?
   this_instance->FooBar();
   return 0;
   }
}

実際のコードではありませんが、私の質問をより明確にするためです。

アプリケーションは実際に動作し、helgrind/memcheck で確認しましたが、エラーは当面の問題とは関係ありません。これを含め、すべての解決策が回避策のように見えるため、この質問をしています。他のものは医師の愛によって言及されたもののようなものであり、他のものはヘルパー静的メソッドを使用しています。

私のアプローチが、ある時点で壮大な失敗につながるかどうか疑問に思っています。何らかの理由で、私には知られておらず、他の経験豊富なプログラマーには明らかです。

4

1 に答える 1

0

関数をスレッドで使用するために静的である必要はありません。インスタンス関数をバインドするか、 this ポインターを渡すか、ラムダで C++11 を使用することができます。
生のスレッドを使用する場合は、スレッドで例外をキャッチする必要があります。例外は、スレッドを開始したコードには伝播しません。
C++11 では、 と を使用して例外を伝播できcurrent_exceptionますrethrow_exception。こちらをご覧ください


編集

型ごとに静的ポインターがある場合、そのインスタンスは 1 つしか持てませんが、コードは静的ポインターがリセットされるのを防ぐために何もしません。そもそもなぜわざわざクラス インスタンスを用意する必要があるのでしょうか。パラメーターを渡すだけなのでしょうか。仕事をするための無料の機能がある方がきれいだと思います。努力する価値がないと思うなら、それはあなたのコードです。あなたの同僚はあなたのデザインについてどう思いますか?

于 2013-07-31T09:29:11.237 に答える