我需要查看 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:
我根据咖啡馆的建议重新编写了程序,但仍然遇到问题。我已尽我所能将我的程序模制到结构咖啡馆中,但我什至无法说出现在导致死锁的原因......我创建了一个新问题here https://stackoverflow.com/questions/4381782/pthread-program-deadlocks-using-condition-variables寻求有关我的代码的帮助。
以下是 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);
}
}