Безопасно ли объявлять мьютекс как статическую переменную в области файлов? - PullRequest
4 голосов
/ 25 июня 2011

Согласно http://msdn.microsoft.com/en-us/library/ms687032%28v=vs.85%29.aspx, WaitForSingleObject () имеет неопределенное поведение, если дескриптор закрывается во время ожидания.

Поскольку мы не можем определить порядок расположения статических переменных, безопасно ли объявлять мьютекс как статическую переменную с областью действия файла?

namespace
{
    static HANDLE g_hMutex = CreateMutex(NULL, FALSE, NULL);
}

int CMyClass::Foo() //CMyClass is a singleton
{
    int ret = 0;
    if (WaitForSingleObject(g_hMutex, 1000) != WAIT_OBJECT_0)
        return -1;

    //Do something

    ReleaseMutex(g_hMutex);
    return ret;
}

Спасибо!

Ответы [ 3 ]

1 голос
/ 25 июня 2011

Я бы очень опасался вызывать любую функцию Win32 API в области имен. Кроме того, так как вы все равно должны выпустить его в своей функции, почему бы не разместить его там тоже? Это гораздо более симметрично.

0 голосов
/ 25 июня 2011

Написанный код не попадет в ситуацию, когда кто-то закроет дескриптор, пока кто-то его ждет, потому что вы никогда не закроете дескриптор.Дескриптор будет закрыт после завершения процесса, но вы не ожидаете его (этот конкретный дескриптор) тогда по определению.

HANDLE не имеет нетривиального деструктора, поэтому он не закроется сам.Что, конечно, само по себе может быть проблематично, но это совсем не та проблема, когда слишком рано закрываете ручку, что вас беспокоит.Я бы посоветовал вам сделать шаг назад и убедиться, что вы понимаете, чего пытаетесь достичь.

0 голосов
/ 25 июня 2011

Это ошибка в DLL.Это рискованно в EXE-файлах.Если CMyClass::Foo() вызывается во время инициализации другого объекта со статической продолжительностью хранения (например, CMyClass::CMyClass инициализация синглтона), этот вызов может предшествовать инициализации g_hMutex.Там нет глобального порядка, в котором объекты инициализируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...