В моем многопоточном приложении я использую std::mutex
для доступа к одному ресурсу несколькими потоками. Это прекрасно работает. Но в какой-то момент моего кода я должен завершить потоки, используя TerminateThread(...)
. Когда я начинаю нить снова (с помощью _beginthreadex
), я получаю исключение, если один из потоков был в замке мьютекса, когда оно было прекращено:C++ многопотоковая блокировка мьютекса «reset»
Параллелизма :: improper_lock Bei Speicherort 0x03B4F3D0.
Это брошено в rtlocks.cpp, строка 1184 (в bool critical_section::_Acquire_lock
):
LockQueueNode * pPrevious = reinterpret_cast<LockQueueNode *>(InterlockedExchangePointer(&_M_pTail, pNewNode));
Я думаю, если бы я мог "сбросить" семафор, я хотел бы получить исключение, верно? Как я могу это сделать?
(я использую <process.h>
)
редактировать
Я попытался следующие:
std::mutex dataStorage_lock;
mutexHandler[0] = &dataStorage_lock; //storing all mutexs in an array
//when trying to delete:
delete mutexHandler[0];
Но я получаю:
Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)
рефакторинга кода так что вам не нужно прерывать потоки. Больше нечего обсуждать. –
Это одна из причин, почему 'TerminateThread()' небезопасно. См. Https://blogs.msdn.microsoft.com/oldnewthing/20150814-00/?p=91811 В этой статье есть бонусное стихотворение Ларри Остермана: «Сколько раз нужно сказать: никогда не называть TerminateThread» –