Проверка блокировки мьютекса - PullRequest
5 голосов
/ 05 июля 2011

В моей программе для создания барьера основной поток посылает сигналы всем остальным потокам. Теперь я хочу проверить, не заблокирован ли поток, выполняющий обработчик сигнала, при запуске обработчика сигнала. Есть ли способ проверить это внутри обработчика сигнала?

1 Ответ

5 голосов
/ 05 июля 2011

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

Лучшим решением было бы, чтобы сигналы принимали только один поток, а все остальные потоки блокировали отправляемые вами сигналы, включая основной поток.Тогда вместо того, чтобы отправлять сигналы отдельным потокам, вы можете просто отправлять сигналы всему процессу.После отправки сигнала единственный поток, который настроен для приема сигналов и их обработки, ожидает вызова с помощью sigwait() для соответствующего сигнала, а после получения быстро проверяет массив значений, чтобы увидеть, какие мьютексы установлены и какие конкретныеим владеет нить.Для этой информации ваш массив может быть массивом значений, которые являются структурным типом, содержащим указатель на мьютекс, заблокированный / разблокированный флаг, а также указатель на pthread_t потока, который вы можете использовать для получения значения идентификатора потокаот.Например, ваша структура может выглядеть примерно так:

typedef struct mutex_info
{
    pthread_mutex_t* mutex_handle;
    pthread_t* thread_handle;
    int locked;
} mutex_info;

mutex_info mutex_info_array[NUM_MUTEXES];

Тогда другие ваши потоки, не беспокоясь об асинхронных сигнальных событиях, могут просто обновлять значения массива каждый раз, когда они блокируют или разблокируют определенный мьютекс.

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