Мне нужно посмотреть, заблокирован ли мьютекс в операторе if, поэтому я проверяю его следующим образом ...
if(mutex[id] != 2){
/* do stuff */
}
но когда я проверяю это, gcc выдает следующую ошибку:
error: invalid operands to binary != (have 'ptherad_mutex_t' and 'int')
Так, как я могу проверить, заблокирован ли мьютекс или нет?
EDIT:
Ключевым компонентом моей проблемы является то, что мои потоки (по своему замыслу) блокируются сразу после передачи управления другому потоку. Таким образом, когда поток A передает управление потоку B, поток A блокируется, поток B выполняет некоторые действия, а затем, когда поток B завершается, он разблокирует поток A.
Проблема в том, что если поток B пытается разблокировать поток A, а поток A еще не завершил саму блокировку, то вызов для разблокировки теряется, а поток A остается заблокированным, что вызывает мертвую блокировку.
UPDATE:
Я переделал свою программу, приняв предложение кафе, но у меня все еще проблемы. Я преобразовал свою программу в структуру caf при условии, что смогу, но я даже не могу сказать, что вызывает мертвую блокировку ... Я создал новый вопрос здесь , обращаясь за помощью с моим кодом.
Ниже приведена работоспособная версия предложения кафе. Я сделал небольшое изменение порядка в функции для потока a, без которого оба потока a и поток b были бы заблокированы при их создании, ожидая условия, которое никогда не сможет измениться.
#include <pthread.h>
int run_a = 0;
pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_a = PTHREAD_COND_INITIALIZER;
int run_b = 0;
pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_b = PTHREAD_COND_INITIALIZER;
void *a(void *);
void *b(void *);
int main(){
int status;
pthread_t thread_a;
pthread_t thread_b;
pthread_create(&thread_a, NULL, a, (void *)0);
pthread_create(&thread_b, NULL, b, (void *)0);
pthread_join(thread_a, (void **)&status);
pthread_join(thread_b, (void **)&status);
}
/* thread A */
void *a(void *i){
while (1) {
printf("thread A is running\n");
sleep(1);
/* unlock thread B */
pthread_mutex_lock(&lock_b);
run_b = 1;
pthread_cond_signal(&cond_b);
pthread_mutex_unlock(&lock_b);
/* wait for thread A to be runnable */
pthread_mutex_lock(&lock_a);
while (!run_a)
pthread_cond_wait(&cond_a, &lock_a);
run_a = 0;
pthread_mutex_unlock(&lock_a);
}
}
/* thread B */
void *b(void *i){
while (1) {
/* wait for thread B to be runnable */
pthread_mutex_lock(&lock_b);
while (!run_b)
pthread_cond_wait(&cond_b, &lock_b);
run_b = 0;
pthread_mutex_unlock(&lock_b);
printf("thread B is running\n");
sleep(1);
/* unlock thread A */
pthread_mutex_lock(&lock_a);
run_a = 1;
pthread_cond_signal(&cond_a);
pthread_mutex_unlock(&lock_a);
}
}