2016-03-23 8 views
0
class ThreadGuard { 
public: 
    ThreadGuard(std::thread &t_): t(t_) {} 
    ~ThreadGuard() 
    { 
     if(t.joinable()) 
      t.join(); 
    } 
private: 
    std::thread &t; 
}; 

void func() 
{ 
    std::thread my_thread(f); 
    ThreadGuard thread_guard(my_thread); 
} 

ThreadGuardオブジェクトを使用して、スレッドが正常終了するまでfuncが終了しないことを保証しようとします。しかし、thread_guardオブジェクトが作成される直前に例外が発生した場合はどうなりますか?変数定義中に例外が発生する可能性はありますか?

+1

いいですね。例外がスローされた場合は、スレッドの構築が失敗したことを意味し、スレッドは実行されないはずです。そうですか? – songyuanyao

+0

** - 1 ** 'if(t.joinable)'は**実際のコードではありません**。 –

+0

申し訳ありませんが、私は間違いました。それは 'if(t.joinable())'でなければなりません。 – song

答えて

0

RAIIのポイントは、リソースを実際に所有するオブジェクトを取得するためのものです。 ThreadGuardは、スレッドが実際に保護されていることをまだ保証することはできません。あなたはより多くのようなものをお勧めします:

class ThreadGuard { 
    std::thread t; 

public: 
    ~ThreadGuard() { 
     if (t.joinable()) t.join(); 
    } 

    // constructors and assignment as appropriate to actually 
    // initialize the thread object 
}; 

そのように、あなただけ書くことができます。

ThreadGuard thread_guard(f); 

ない心配を。

+0

あなたの答えをありがとう。しかし、私は適切なコンストラクタを実装する方法をあまり理解していません。 'std :: thread t'というメンバを初期化する唯一の正しい方法は、' std :: thread'クラスから継承し、自分のクラスのコンストラクタで直接コンストラクタを呼び出すことです。そのような場合、型のパラメータを渡す必要があります...私はそれを、関数、呼び出し可能なオブジェクトなどと呼ぶ方法を私のコンストラクタに知らない。それは私のためにちょっと複雑です。 – song

関連する問題