スレッドローカルクリーンアップのために、現在のスレッドがboost :: threadによって作成されたかどうかを確認するアサーションを作成する必要があります。これが事実かどうかどうすれば確認できますか?つまり、現在のスレッドがboost :: threadによって処理されるかどうかを確認するにはどうすればいいですか?スレッドがブーストスレッドかどうかをチェック
スレッドが終了したときにスレッドローカルストレージのクリーンアップを行うには、これが必要です。ブーストのthread_local_ptrは、スレッド自体がブーストスレッドである場合にのみ動作するように見えます。
私はクリーンアップ時にチェックを行っていませんが、スレッドの寿命中はいつかチェックしています。いくつかの関数はAPI /コールバックの1つを(間接的に)呼び出してスレッドローカルストレージを割り当てます。ブーストスレッドだけがこれを行うことができます。そのため、スレッドがブーストスレッドでない場合は、その瞬間に検出する必要があります。
一般的なクリーンアップハンドラを持たない問題については、Destruction of static class members in Thread local storageを参照してください。私はそれに答え、pthread_clenaup_pushが実際には動作しないことを認識しました。スレッドからクリーンな終了フォームで呼び出されません。
私はブーストスレッドを検出する答えはありませんが、選択した答えは私の問題の根本を解決します。ブーストthread_specific_ptrは任意のpthreadでクリーンアップを呼び出します。それは孤立したテストが動作することを示すので、それが私のために働かない原因となっているに違いありません。
私はあなたが本当に静的*アサーションを望んでいるとは思わない。静的アサーションはコンパイル時にチェックされますが、実行時に何かが作成されたかどうかをチェックするには早すぎます。普通の主張がほしいと思う。 –
私は静的アサーションを修正しました。 –