私は同じリソースを複数のスレッドでアクセスするマルチスレッドアプリケーションでstd::mutex
を使用します。これは正常に動作します。しかし、私のコードのある時点では、TerminateThread(...)
を使ってスレッドを終了させなければなりません。私は(_beginthreadex
を使用して)再びスレッドを開始すると、それが終了したときのスレッドの一つが、ミューテックスロックにあった場合、私は例外を取得:C++マルチスレッドミューテックスロック "リセット"
同時実行:: improper_lock BEI Speicherort 0x03B4F3D0。
これはrtlocks.cppにスローされる、(bool critical_section::_Acquire_lock
で)行1184:
LockQueueNode * pPrevious = reinterpret_cast<LockQueueNode *>(InterlockedExchangePointer(&_M_pTail, pNewNode));
私はmutexを "リセット" することができれば、私は右、例外になるだろう、と思いますか?これどうやってするの?
(私は<process.h>
を使用)
編集
私は次のことを試してみました:
std::mutex dataStorage_lock;
mutexHandler[0] = &dataStorage_lock; //storing all mutexs in an array
//when trying to delete:
delete mutexHandler[0];
をしかし、私は得る:
デバッグアサートに失敗しました!
式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)
リファクタリング、コードをスレッドを終了する必要はありません。議論すべきことはもうありません。 –
これは 'TerminateThread()'が安全でない理由の1つです。 https://blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p=91811その記事には、Larry Ostermanのボーナス詩があります。「TerminateThreadを何度も電話しないでください」 –