Pthread Mutex блокировка - PullRequest
2 голосов
/ 14 июля 2011

У меня есть основной вопрос по обработке мьютекста.У меня есть файл, который появляется в 2 других потоков (из 3).Мне нужно взаимно исключить доступ к нему потоком.Поэтому я делаю следующее в функции, вызываемой из обработчика thread1:

int sub_routine_thread1{

pthread_mutex_lock(&mut)
FILE *fp;
fp = fopen("myfile", "r");
if(fp == NULL){
return -1;
}
pthread_mutex_unlock(&mut)
return 0;
}

Как вы можете видеть, я уже знаю, что если указатель файла возвращает NULL, мой мьютекс блокируется здесь, и разблокировка никогда не происходит,Поэтому я изменил это на следующее:

int sub_routine_thread1{

pthread_mutex_lock(&mut)
FILE *fp;
fp = fopen("myfile", "r");
if(fp == NULL){
   pthread_mutex_unlock(&mut)
   return -1;
}
pthread_mutex_unlock(&mut)
return 0;
}

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

int sub_routine_thread1{
     pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
     pthread_mutex_lock(&mut);
     FILE *fp;
     fp = fopen("myfile", "r");
     if(fp == NULL){
     return -1;
     }
     pthread_cleanup_pop(1);
     return 0;
}

Это правильный путь?Не могли бы вы уточнить?

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Но после этого, хотя у меня плохое предчувствие, это не тот способ, которым нужно делать мокс-локс.

Да, это так. Ваш второй пример совершенно в порядке. pthread_cleanup_push используется для запуска функций, когда поток отменяется, это не то, что вы должны использовать здесь.

Тем не менее, я бы предпочел сделать что-то вроде

int sub_routine_thread1() {
  FILE *fp;
  int ret = -1;
  pthread_mutex_lock(&mut)
  fp = fopen("myfile", "r");
  if(fp != NULL){
     //do_stuff_unlocked(fp);
     ret = 0;
  }
  pthread_mutex_unlock(&mut)
  return ret;
}
1 голос
/ 14 июля 2011

Прежде всего

if(fp == NULL){
    return -1;
    pthread_mutex_unlock(&mut); /* This is never reached. */
}

if(fp == NULL){
    pthread_mutex_unlock(&mut); /* Probably what you want. */
    return NULL;
}

Во-вторых, обработчики очистки действительно очень полезны и полезны, но они вызываются только тогда, когда вы отменяете поток с помощью pthread_cancel.Они не вызываются при нормальном выходе из потока (и этот возврат считается нормальным).

...