8

Boostライブラリのバージョン1.50.0のリリースノートで、2つの重大な変更点に気づきました(ここを参照)。

#6266重大な変更:スレッドデストラクタは、参加可能であれば、terminateを呼び出す必要があります。

#6269重大な変更:スレッド移動代入は、参加可能であれば終了を呼び出す必要があります。

これは、現在Boost 1.49.0を使用している既存のプロジェクトにとってどのような意味がありますか?何か変更する必要がありますか?はいの場合、正確に何を変更する必要がありますか?また、既存のプロジェクトの1つを変更するのを忘れた場合はどうなりますか?コンパイル時のエラーが発生しますか(そうなることを願っています)、それとも厄介で見つけにくいランタイムの問題が発生しますか(絶対にそうは思わない)?

4

2 に答える 2

7

「Breakingchange」とは、「以前はXでしたが、現在はYの動作に依存していると、プログラムが壊れている」という意味です。

与えられた2つの変更について、これは、デストラクタまたはムーブ代入呼び出しjoin()(または)に依存している場合detach()、これは以前の動作であると私が信じていることを意味します。これはコンパイル時のエラーではありませんが、予測できない実行時の動作でもありません。問題の原因であるデストラクタに直接つながる、きれいなクラッシュが発生します。join()detach()std::terminate()boost::thread

于 2012-07-09T11:16:03.217 に答える
7

次のコードは以前は正しく機能していましたが、v3では、スレッドからサイレントにデタッチするのではなく、を呼び出すtため、プログラムはスコープを離れたまま中止されます。thread::~threadstd::terminate

#include <boost/thread.hpp> 
#include <iostream>

void f()
{}

int main() 
{ 
  {
    boost::thread t(f);
  }
  std::cout << "exiting gracefully" << std::endl;
} 
于 2012-07-09T12:27:11.530 に答える