2012-02-15 8 views
2

はboost :: threadオブジェクトのスレッドセーフですか? boost :: threadのメンバメソッドの呼び出しをスレッドセーフであるとロックする必要がありますか?boost :: threadはスレッドセーフですか?

編集1:私の目的を気にしないでください。あなたは単に質問に答えることができますか? 目的: スレッドのプログラムとして1つのプロシージャを考えてください。このプロシージャは、そのスレッドを停止するプロシージャです。スレッドプロシージャは、ループを継続するか否かをチェックするwhileループです。 Stopプロシージャは、条件をFALSEに設定し、スレッドの終了まで待機して(ジョイン)、他のアクションを実行します。ポイントは、stopプロシージャが複数のスレッドを呼び出すことができることです。

しかし、私の質問は一般的であり、native_handle同時に、このようなGET_IDとして1つのスレッドオブジェクトのメンバメソッドを呼び出して、いくつかの次の10億件のスレッド()、()などのスレッドへの参加

+1

私はあなたの質問の目的を理解していません。どの状況下で、複数のスレッドからスレッドを制御する必要がありますか? – Tudor

+0

私が作った編集を見てください。 – Tudor

答えて

2

は一つだけから行われるべきである考えます他のスレッド(できればそれを開始したスレッド)。スレッドの安全性のためのポイントが、この場合に

オクラホマありませんが、私は実際にブースト::スレッドのソースコードを見てきた:

void thread::join() 
{ 
    detail::thread_data_ptr const local_thread_info=(get_thread_info)(); 
    if(local_thread_info) 
    { 
     bool do_join=false; 

     { 
      unique_lock<mutex> lock(local_thread_info->data_mutex); 
      while(!local_thread_info->done) 
      { 
       local_thread_info->done_condition.wait(lock); 
      } 
      do_join=!local_thread_info->join_started; 

      if(do_join) 
      { 
       local_thread_info->join_started=true; 
      } 
      else 
      { 
       while(!local_thread_info->joined) 
       { 
        local_thread_info->done_condition.wait(lock); 
       } 
      } 
     } 
     if(do_join) 
     { 
      void* result=0; 
      BOOST_VERIFY(!pthread_join(local_thread_info->thread_handle,&result)); 
      lock_guard<mutex> lock(local_thread_info->data_mutex); 
      local_thread_info->joined=true; 
      local_thread_info->done_condition.notify_all(); 
     } 

     if(thread_info==local_thread_info) 
     { 
      thread_info.reset(); 
     } 
    } 
} 

そしてはい、それはスレッドセーフであることが表示されます。

+0

これは私が知りたかったものです。ありがとう:-) – uiii

+0

boost :: threadは基本的な理由からスレッドセーフではありません。つまり、smart_ptrの同じインスタンスを2つの異なるスレッドで安全にコピーして破棄することはできません。 –

+0

@Getano Mendola:ここでは 'boost :: thread'のすべてではなく、ここで' join 'について話していました。とにかく、 'join'は、子スレッドimoを生成したものとは別のスレッドから呼び出すべきではありません。 – Tudor

0

boost::threadスレッドセーフではありません。

関連する問題