Если я создаю простую программу, как ...Почему std :: mutex генерирует исключение, когда я вызываю lock()?
#include <mutex>
std::mutex gMutex;
int main()
{
gMutex.lock();
gMutex.unlock();
return 0;
}
... код выполняется без проблем.
Однако в другом приложении, когда я создаю глобальный экземпляр std::mutex
и пытаюсь вызвать метод lock()
, возникает исключение. (Я не точный текст исключения, но жаловались на внутреннюю части объекта мьютекса существо нуля)
Глядя на внутреннем состоянии объекта мьютекса, который не, я вижу, что _Mtx_storage
член имеет это _Val
установлено значение 0.000000000000000000
, а его значение равно _Pad
. Член имеет значение, отличное от нуля, которое указывает на небольшой буфер (я думаю, это был размер 0x4f байтов) нулевых байтов.
Когда я сравниваю это состояние с тем, что в простой программе выше, я вижу, что состояние _Mtx_storage
не является нулевым (я думаю, что это 0.000000000002
) в коде, который работает. Что может привести к тому, что оно будет нулевым в моем другом приложении?
Я использую Visual C++ 2015.
Любые идеи приветствуются. Благодаря!
Не видя кода, его трудно узнать. Мое лучшее предположение - фиаско порядка инициализации. (Является ли код запущенным до 'main'? Если да, то как вы знаете, что мьютекс был построен еще?) Повреждение памяти? Уже держите замок? Другой поток выпустил замок, не удерживая его? –
У меня есть мьютекс в файле .cpp (глобальный) над двумя другими функциями, которые его используют (определен в том же файле .cpp). У меня есть точки останова на вызовах блокировки, поэтому я знаю, что первый вызов не работает – charunnera
Не могли бы вы создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), чтобы показать нам? Код говорит более миллиона слов. –