У меня есть основной вопрос по обработке мьютекста.У меня есть файл, который появляется в 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;
}
Это правильный путь?Не могли бы вы уточнить?