免責事項:BoostもC++11も許可されていません。
私はのインスタンスを作成し、Foo
それをいくつかのスレッドで操作するプログラムを持っています。次に、それらのスレッドがセグメンテーション違反に陥らないように、安全に削除したいと思います。
Foo
スレッド関数が実行されるたびにミューテックスメンバーを追加してロックしました。異なるスレッドが互いに競合しないようにするため。
class Foo
{
public:
pthread_mutex_t mutex;
};
void* thread ( void* fooPtr )
{
Foo* fooPointer = (Foo*) fooPtr;
while ( 1 )
{
if ( fooPointer )
{
pthread_mutex_lock ( &fooPointer->mutex );
/* some code, involving fooPointer */
pthread_mutex_unlock ( &fooPointer->mutex );
}
else
{
pthread_exit ( NULL );
}
}
}
foo
スレッドでエラーが発生しないように、安全に削除したいと思います。デストラクタを追加しましたFoo
:
Foo::~Foo()
{
pthread_mutex_lock ( &mutex );
}
これで、すべてのスレッドが現在のループを終了するまで、オブジェクトは削除されません。
問題は、インスタンスが削除された後、ミューテックスのロックが解除されるかどうかです。インスタンスが削除された後、すべてのスレッドが終了しますか?答えはきっとno
。だから私はデストラクタを変更しますが、今ではスレッドセーフではないようです:
Foo::~Foo()
{
pthread_mutex_lock ( &mutex );
pthread_mutex_unlock ( &mutex );
}
スレッドファンクションpthread_mutex_unlock ( &mutex );
は、オブジェクトが削除された後および削除される前に、ミューテックスをロックしてインスタンスの操作を開始できますか?