2012-01-25 6 views
0

他の人のコードをクリーンアップしようとしていますが、クラスにpthread_mutex_tメンバ変数が含まれているケースがたくさんあります。多くの場合、pthread_mutex_init()は決して呼び出されず、ロック/ロック解除もされません。そのオブジェクトが範囲外になると、後で適切に処理するために何が必要なのでしょうか?ロックを解除しようとすることはできますか(init'dされていない場合はどうなりますか?)私はそれを破壊する必要がありますか?初期化されていないミューテックスが範囲外になる - クリーンアップ?

分析ツールでリソースが失われている可能性があります。何かが失われていますか?

答えて

1

クリーンアップを行っていて、一度も使用されていないミューテックスが見つかった場合は、それを削除することを検討する必要があります。

mutexを使用する場合は、pthread_mutex_destroy()を呼び出す必要があります。クラスデストラクタは、特にpthread_mutex_init()がコンストラクタで呼び出された場合には、それを行うのに適しています。

mutexは、破棄されるまでにロックを解除する必要があります。または、未定義の動作が発生することに注意してください。しかしこれはmutexの使用方法によって保証されるべきです。

+0

私はそう言っていたはずです:それが使われない場合があります。それはしばしばありますが、常にそうとは限りません。 _init()は使用されないと呼び出されません - 私は確信できません。ミューテックスが_init()されていなければ、 'destroy'をコールすることはできますか? –

+1

私は、初期化されていないミューテックスを破壊することをお勧めします。 'pthread_mutex_init()'と 'pthread_mutex_destroy()'を呼び出します。 –

+1

ただし、 'pthread_mutex_init()'はmutexを初期化する唯一の方法ではありません。 'PTHREAD_MUTEX_INITIALIZER'で初期化することもできます。詳細については、質問からリンクされているマンページを参照してください。 –

関連する問題