0

次のようにマップを使用しています。

キー ---> タスク ID

値 --->pthread_cond_tオブジェクト

特定のタスクが完了すると、一致する要素pthreadsを使用して、それに関連付けられているすべてのタスクを起動します。pthread_cond_t

私の質問は簡単です - とは何pthread_cond_tですか? それはオブジェクトですか?それを削除すると、マップはコンストラクターを呼び出しますが、これは私にとっては良くありません。そうでない場合は、返品できますか

pthread_cond_t cond = *(_flushCond->operator [](task_id)); //map of conditions
_flushCond->operator [](task_id) = NULL;
return cond;

私がやろうとしているのは、後で使用するためにマップ内のオブジェクトを解放し (ID を再利用します)、pthread_cond_tそこにあったオブジェクトを返すことです。

4

1 に答える 1

3

他の人がコメントしているように、それは実装定義型に対して不透明(OPAQUE)型(または必要に応じてハンドル)です。いくつかの実装では、それは実際の条件変数構造へのポインターであり、構造自体であり、いくつかの実装内部データ構造への単なるポインターである可能性があります。POSIX標準は、それについて保証もコミットメントもしていません。また、そのタイプの「オブジェクト」で実行できる操作の特定のセットのみがあります。その点で、pthread_mutex_tやpthread_tなどの他のタイプのPthreadと非常によく似ています。

STLマップの値としてpthread_cond_tを安全に、または少なくとも移植可能に使用することはできません。その理由は、値の要件はコピーで構築可能であり、割り当て可能である必要があるためです。技術的にはそれはpthread_cond_tに対して実行可能ですが、そうすることは合法ではありません。

「コピー可能」ではない他のタイプの場合と同様に、代わりにpthread_cond_t *(ポインター)を格納する必要があります。

于 2012-05-08T19:37:43.563 に答える