2011-06-23 6 views
0

これは基本的にスレッドセーフであるライブラリの作成を開始したスレッド問題です。私の使用例は次の通りです。 -QThreadStorageを使用したスレッドセーフについてについて

struct <> 
    { 

     int thread_specific_value; 
} 

1)たとえば5つのスレッドをスピンします。

2)各スレッドは、操作を実行し、上記のデータ構造内にthread_specific_valueを格納します。これは、各スレッドの初期化時に動的に割り当てられ、QThreadStorageに追加されます。

3)すべてのスレッドがメインスレッドに戻ったら、すべてのスレッドのerrno値にアクセスして何らかの処理を行いたい。メインスレッドからスレッドを削除する前に、そのストレージデータの情報を取得し、メインスレッドの特定のストレージに格納することはできますか?

nutshellでは、スレッド固有のすべてのストアドデータのQThreadStorageを繰り返し処理し、メインスレッドから何らかの処理を行うにはどうすればよいですか?

答えて

3

QThreadStorageに格納されているデータは、そこに置かれたスレッドからのみアクセスできます。期間。他のスレッドから同じデータにアクセスする場合は、別のスレッドに追加データを格納する必要があります。特に、スレッド固有の値はスレッド終了時に破棄されます。値を保持したい場合は、スレッドが終了する前のどこかに保存してください。

要するに、スレッド間通信にQThreadStorageを使用しないでください。それはそこにあるものではありません。

+0

返信いただきありがとうございます。私が以前に言ったように、私はスレッドを削除していません。したがって、ドキュメントごとに、スレッド固有のデータは破棄されません。このアクセシビリティを使用できる他のカスタムのオープンソーススレッドストレージデータ構造がありますか? – Kartlee

+1

"QThreadStorageは、データの所有権(新しいものでヒープ上に作成する必要があります)を取得し、スレッドが正常に終了するか、終了するかによってスレッドを削除します。 - 終了時に、それが削除されたときではありません。スレッドからデータをやりとりする独自の方法をロールバックするのは難しくありません。また、実際の標準化されたメソッドを認識していないユースケースには十分な違いがあります(TLSを公開することは非常に稀です)。 。) – bdonlan

+0

ある種のスレッド間通信にQThreadStorageを使用することはできます。例えば、共通の機能で認識されるマーカーでスレッドにタグを付けるとします。コードを実行しているスレッドの「名前」を認識するために使用します。 – AlexanderVX

関連する問題