6

スレッド化されたコードで、 C でpthread_cond_t c;条件変数またはミューテックスを作成した場合pthread_mutex_t m;、すべての作業が完了した後でそれらを破棄することをお勧めします。

なぜそうなのですか?

condまた、関数を使用して動的に初期化された場合、変数を破棄する必要があるのはなぜですかpthread_cond_init();

David Butenhof からの引用: " Programming with POSIX Threads "

「条件変数を動的に初期化するときは、pthread_cond_destroy を呼び出して、必要がなくなったときに条件変数を破棄する必要があります。PTHREAD_COND_INITIALIZER マクロを使用して静的に初期化された条件変数を破棄する必要はありません」

4

1 に答える 1

9

pthread_cond_t と pthread_mutex_t はリソースと見なされます。

リソースを使い終わったら、リソースを破棄/クリーンアップ/閉じる必要があります。これは、使い終わったときにファイルを閉じたり、メモリを解放したりする必要があるのと同じです。そうしないと、リソース リークが発生し、これらのリソースが不足する可能性があります。

これらをリソースとして扱うことで、実装の実装方法の自由度が高まります。特定の実装では、それらを _destroy() するのを忘れても害がない場合もあれば、mutex/条件変数を必要なカーネル リソースに接続する場合もあります。不要になったときにクリーンアップできます。pthread_mutex_initの理論的根拠のセクションでは、さらに概要が説明されており、条件変数にも同じことが当てはまります。

PTHREAD_COND_INITIALIZER で条件変数を初期化する場合、静的に割り当てられたミューテックスを初期化する必要があります。つまり、アプリケーションが終了するまで存続し、その時点でシステムによって破棄されます。おそらくそれが作者の意図です。これは、動的に初期化されるミューテックス/条件変数にも適用され、システムはそれらもクリーンアップします。

ほとんどのリソースは、アプリケーションの終了時に自動的にクリーンアップされるため、すべてを手動でクリーンアップするのが適切な方法なのか、そのような場合にシステムに任せるかは別の議論です。

于 2013-04-10T11:50:17.497 に答える