Почему использование мьютекса правильно в C ++? - PullRequest
0 голосов
/ 24 октября 2019

Раньше мне задавали вопрос о мьютексе, код работает нормально, но я запутался в этом результате:

::std::mutex s_mutex;
void funcA()
{
    s_mutex.lock();

    printf( "funcA \n" );

    s_mutex.unlock();
}

void funcB()
{
    s_mutex.lock();

    funcA();

    printf( "funcB \n" );

    s_mutex.unlock();
}

int main()
{
    funcB();

    return 0;
}

Он работает нормально и выведите на печать то, что я не сделал.

funcA 
funcB 

Но почему? Эта функция вызывается в основном потоке и, кажется, вызывает блокировку дважды.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Как уже упоминалось @Quentin, блокировка std::mutex из одного потока несколько раз приводит к неопределенному поведению. Чтобы позволить потоку заблокировать объект мьютекса несколько раз, вы можете использовать std :: recursive_mutex .

Рекурсивный мьютекс является блокируемым объектом, так же как мьютекс, но позволяет одному и тому же потоку приобретать несколько уровней владения объектом мьютекса.

Это позволяет заблокировать (или попробовать-lock) объект мьютекса из потока, который уже блокирует его, приобретая новый уровень владения объектом мьютекс: объект мьютекса фактически останется заблокированным, владеющим потоком, пока его разблокировка не будет вызвана столько раз, сколько этот уровень владения.

0 голосов
/ 24 октября 2019

С std::mutex::lock():

Если lock вызывается потоком, которому уже принадлежит мьютекс, поведение не определено : дляНапример, программа может тупик. Реализация, которая может обнаружить недопустимое использование, рекомендуется генерировать std::system_error с условием ошибки resource_deadlock_would_occur вместо взаимоблокировки.

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