Можно проверить, заблокирован ли мьютекс перед вызовом pthread_cond_wait ()? - PullRequest
2 голосов
/ 01 марта 2012

Я хотел бы добавить отладочный код к абстракции pthread_cond_wait в моем коде, чтобы проверить, действительно ли вызывающий код содержит мьютекс, как и должно быть.Это делается для проверки правильности остальных абонентов.

Есть ли способ проверить, заблокирован ли мьютекс, или включить режим отладки в реализации pthreads (в ​​Linux), чтобы сказать мне, если это не так?

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Если вы создаете мьютекс как мьютекс с проверкой ошибок, используя:

pthread_mutexattr_t attr;
pthread_mutex_t errchkmutex;

pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_init(&errchkmutex, &attr);

... затем pthread_cond_wait() вернет EPERM, если мьютекс не заблокирован вызывающим потоком.

(конечно, вы бы добавили проверку ошибок в этот код инициализации мьютекса).

Я думаю, что проверочные мьютексы - это именно тот «режим отладки», который вы ищете.

0 голосов
/ 02 марта 2012

Ответ, собранный из zvrba и "R" и некоторых других исследований, заключается в создании мьютексов с атрибутами проверки ошибок и проверке возвращаемого значения pthread_cond_wait().

pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_ERRORCHECK);

Другая важная информация:

  • Мой glibc требует #define _GNU_SOURCE перед включением, чтобы включить pthread_mutexattr_settype()

  • Я обнаружил, что у меня установлены справочные страницы POSIX и LinuxThreads. Я не уверен, из каких (ubuntu) пакетов пришли различные пакеты, но редактирование /etc/manpath.config, чтобы поставить "3posix" первым, означает, что я получаю правильные пакеты сейчас.

0 голосов
/ 01 марта 2012

pthread_cond_wait завершится ошибкой, если мьютекс не заблокирован вызывающим потоком. Вы проверяете возвращаемые значения функций pthread? Если нет, то это может привести к катастрофе, особенно с многопоточностью, а не с другими системными вызовами.

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