2017-02-23 8 views
-2

Если я создаю простую программу, как ...Почему 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.

Любые идеи приветствуются. Благодаря!

+2

Не видя кода, его трудно узнать. Мое лучшее предположение - фиаско порядка инициализации. (Является ли код запущенным до 'main'? Если да, то как вы знаете, что мьютекс был построен еще?) Повреждение памяти? Уже держите замок? Другой поток выпустил замок, не удерживая его? –

+0

У меня есть мьютекс в файле .cpp (глобальный) над двумя другими функциями, которые его используют (определен в том же файле .cpp). У меня есть точки останова на вызовах блокировки, поэтому я знаю, что первый вызов не работает – charunnera

+1

Не могли бы вы создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), чтобы показать нам? Код говорит более миллиона слов. –

ответ

1

Вероятно, мьютекс еще не инициализирован. Если этот код работает до main, посмотрите, можете ли вы реплицировать проблему без кода, запущенного до main.

+0

Это действительно так. Коллега проверил код в другом исходном файле, который создал два статических объекта (которые полагались на мой класс распределителя, содержащий рассматриваемый мьютекс) Эти статические объекты создавались до мьютекса, что приводило к сбою. Я добавил это в список неожиданностей, которые могут возникнуть при разработке команды.:) Спасибо! – charunnera