C Pthreads значения мьютекса? - PullRequest
3 голосов
/ 15 октября 2010

Я пишу программу с несколькими критическими разделами.Дело в том, что мне нужно проверить значение мьютекса в операторе if.

Я хотел бы сделать что-то вроде этого:

if pthread_mutex(&mutex) == 0 // locked 
  // Do something
else if pthread_mutex(&mutex) == 1 // unlocked 
 // Do something else

Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 15 октября 2010

Вы хотите pthread_mutex_trylock().

По этой ссылке:

Функция pthread_mutex_trylock () должна быть эквивалентна функции pthread_mutex_lock (), за исключением того, что если объект мьютекса, на который ссылается мьютекс, в данный момент заблокирован (любым потоком, включая текущий), вызов должен немедленно вернуться. ... Возвращаемые значения ... Функция pthread_mutex_trylock () должна возвращать ноль, если получена блокировка объекта мьютекса, на который ссылается мьютекс. В противном случае возвращается номер ошибки, указывающий на ошибку

Итак, ваш код будет выглядеть так:

pthread_mutex_t *m = /* ... */;

if (pthread_mutex_trylock(m) == 0)
{
    /* Success!  This thread now owns the lock. */
}
else
{
    /* Fail!  This thread doesn't own the lock.  Do something else... */
}
1 голос
/ 15 октября 2010

Нет, вы не должны пытаться это делать.Я думаю, что мьютексы pthread созданы для того, чтобы регулировать локальный доступ к какому-либо критическому ресурсу, и если ваша программа не знает, удерживает ли этот текущий поток блокировку, вы используете неправильный инструмент.Я вижу две альтернативы:

  • сохранить переменную в стеке функции, где вы отслеживаете, что она заблокирована здесь, или, если действительно необходимо, сохранить идентификатор потока и сравнить с этим
  • переключиться на sem_t в качестве управляющего DS.у них нет этого ограничения на то, чтобы их приклеивали к конкретному потоку, который их «держит», но они основаны на токене, поэтому любой поток, который получает токен, может выполнять требуемую работу.(но будьте осторожны и проверьте возвращаемое значение функций, которые эти процедуры могут прерывать.)
0 голосов
/ 15 октября 2010

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

...