2016-08-12 4 views
2

は、ソースコードは、そのようなものです:なぜ "boost.thread"は "intrusive_ptr_add_ref"を手動で呼び出しますか? boost.threadのスタート機能で

bool thread::start_thread_noexcept() 
{ 
    uintptr_t const new_thread = _beginthreadex(
      0, 
      0, 
      &thread_start_function,  
      thread_info.get(),   
      CREATE_SUSPENDED,   
      &thread_info->id);   

    if (!new_thread) 
    { 
     return false; 
    } 

    // why call this line? 
    intrusive_ptr_add_ref(thread_info.get()); 

    thread_info->thread_handle = (detail::win32::handle)(new_thread); 
    ResumeThread(thread_info->thread_handle); 
    return true; 
} 

thread_info私は、intrusive_ptr_add_refを呼び出す前に、カウントがすでに1で、スレッド情報データを指す侵入スマートポインタでありますなぜここでintrusive_ptr_add_refを手動で呼び出すのか分かりません。 Intrusiveスマートポインタの仕事はintrusive_ptr_add_refとintrusive_ptr_releaseを自動的に呼び出すはずです。

私はソースコードをステップアップしようとしましたが、何の手掛かりも見つかりませんでした。

誰でも教えてください 1.なぜここで手動でintrusive_ptr_add_refを呼び出しますか? 2. intrusive_ptrを使用するときの条件は、手動でintrusive_ptr_add_refを呼び出す必要があります。

ありがとうございました。

答えて

1

ここで手動でintrusive_ptr_add_refを呼び出しますか?

ポインタの所有権の共有を表す。

_beginthreadexは、パラメータとして、thread_info.get()が渡された。このパラメータは、スレッドの開始時にthread_start_functionに渡されます。そして、この関数はそれが起こるまでポインタが有効なままであることを期待しています。

ここで、_beginthreadexは単純な関数です。これは、任意のパラメータなどを取ることができる可変的なテンプレートではありません。これは、裸のポインタだけを正確にとり、それを正確にstart関数に渡します。

boost::threadを作成する人はthread_start_functionがこれまで呼び出される前にthread::detachを呼び出すことが非常に可能性があります。そしてそれが起こった場合には、thread_info侵入ポインタが破壊され、その結果、含まれているオブジェクトが破壊されます。

そして、_beginthreadexには破壊されたポインタが残っています。それは良くないね。

_beginthreadexは、intrusvieポインタの所有権を要求します。しかし、APIはboost::intrusive_ptrではないので、どうすればよいですか?

参照カウントをバンプする。参照カウントの増加は、_beginthreadexがオブジェクトの所有権をどのように要求するかです。

+0

ありがとうございました!あなたの答えはとても価値があり、すべてを明らかにする! – zach

関連する問題