【发布时间】:2011-05-20 17:35:49
【问题描述】:
我需要在 if 语句中查看互斥锁是否被锁定或解锁,所以我像这样检查它...
if(mutex[id] != 2){
/* do stuff */
}
但是当我检查它时,gcc 给了我以下错误:
error: invalid operands to binary != (have 'ptherad_mutex_t' and 'int')
那么如何检查互斥体是否被锁定?
编辑:
我的问题的一个关键组成部分是我的线程(按设计)在将控制权传递给另一个线程之后立即锁定自己。所以当线程 A 将控制权交给线程 B 时,线程 A 被锁定,线程 B 做一些事情,然后当线程 B 完成后,它会解锁线程 A。
这样做的问题是,如果线程 B 尝试解锁线程 A,而线程 A 尚未完成自身锁定,则解锁调用将丢失,线程 A 仍处于锁定状态,从而导致死锁。
更新:
我根据 caf 的建议重新制作了我的程序,但我仍然遇到问题。我已尽我所能将我的程序融入到结构 caf 中,但我什至无法说出现在导致死锁的原因...我创建了一个新问题 here 寻求有关我的代码的帮助。
以下是 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);
}
}
【问题讨论】:
-
快速说明,互斥锁必须由锁定它们的线程解锁。如果您想要一个可以由一个线程锁定并由另一个线程解锁的锁定结构,则必须使用信号量(或构建您自己的信号量,如上例所示)。如果一个线程锁定一个 mutx 而另一个线程释放它,就会出现非常丑陋的同步错误