Можем ли мы заблокировать функцию с мьютексом pthreads для всех остальных ее вызовов? - PullRequest
0 голосов
/ 05 декабря 2010

Скажите, что программа порождает поток.Этот поток вызывает func1 ().Тем не менее, func1 () также вызывается в разных местах основного приложения.Если я оберну его в блокировку мьютекса только в потоке, будет ли это безопасно для всего приложения?Или нужно зайти и запереть его?И если в нем есть другие функции, которые он вызывает, но также и в основном приложении в разных местах, нужно ли идти рекурсивно и блокировать их?

Ответы [ 3 ]

3 голосов
/ 05 декабря 2010

Избавьтесь от привычки думать, что вы защищаете функции с помощью мьютексов, вы этого не делаете.

На самом деле вы защищаете ресурсы , такие как переменные, общие для потоков.

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

Например, если func1()и func2() оба обращаются к общей переменной x, и вы можете вызвать func2() либо с func1(), либо с main(), вам придется разработать решение, которое может определить, заблокирован ли мьютекс, такчто func2() может требовать / освобождать (когда вызывается из main) или ничего не делать (когда вызывается из func1()).Либо так, либо используйте рекурсивный мьютекс.

Функции, которые не являются потокобезопасными (например, использование статических областей данных) можно защитить мьютексами, но я нахожу, что проще реорганизовать их такони изначально поточно-ориентированы (с выделенной памятью или локальным хранилищем).

0 голосов
/ 05 декабря 2010

Пока вы объявляете static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; в функции и используете ее, вы можете выполнять то, что вы хотите.Но создание функций, которые не являются реентерабельными, имеют глобальное состояние и т. Д., Как правило, плохо (тм).Хороший дизайн - это блокировка данных, а не глобальные (или одиночные, что является эвфемизмом глобальных переменных).

0 голосов
/ 05 декабря 2010

Вам нужно только заблокировать общие ресурсы или что-то не локальное для потоков.Вы также должны рассмотреть возможность написания своих функций для повторного использования, когда это возможно.Повторно входящие функции по своей природе поточно-ориентированы, в то время как не все потоко-безопасные функции могут быть возвращены.

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