void*pthread_producer();{while(1){pthread_mutex_lock(&mutex_p);…………pthread_mutex_unlock(&mutex_p)}}void*pthread_consumer(void*){while(1){pthread_mutex_lock(&mutex_c)…... void* pthread_producer( ); { while (1) { pthread_mutex_lock( &mutex_p ); ………… pthread_mutex_unlock( &mutex_p ) } } void* pthread_consumer( void* ) { while (1) { pthread_mutex_lock( &mutex_c ) ………… pthread_mutex_unlock( &mutex_c); } } 我们知道,两把锁,mutex_p, mutex_c,这种情况容易出现死锁,即 mutex_p 锁上,还未解锁即跳到第二条线程,mutex_c锁上,未解锁即跳到第一条线程,这样即出现死锁。 但是在这里将两把锁用成一把锁,如:将mutex_c改为mutex_p。 因为线程是随意跳的,如果一线程锁上,为解锁即跳到二线程,此时,二线程也锁上,跳到一线程,那么一线程和二线程不是也读锁上了么?,不是就死锁了么?
1 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
如果你将mutex_c换成mutex_p,则不会死锁,因为,你第一个线程锁上后,切换到第二个线程,因为mutex_p未释放,第二个线程无法获取mutex_p,进入等待状态,此时OS将再次调度第一个线程,直到第一个线程释放mutex_p之后,第二个线程才会被激活,然后调试第二线程,获取mutex_p.
使用OS提供的互斥量来保护公共资源还是比较安全的,但如果用二值信号量的话,就可能会有优先级反转的情况.
添加回答
举报
0/150
提交
取消