我试了一下,这种情况下,不会出现死锁,求原因。

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。 因为线程是随意跳的,如果一线程锁上,为解锁即跳到二线程,此时,二线程也锁上,跳到一线程,那么一线程和二线程不是也读锁上了么?,不是就死锁了么?

慕尼黑8549860
浏览 57回答 1
1回答

潇潇雨雨

如果你将mutex_c换成mutex_p,则不会死锁,因为,你第一个线程锁上后,切换到第二个线程,因为mutex_p未释放,第二个线程无法获取mutex_p,进入等待状态,此时OS将再次调度第一个线程,直到第一个线程释放mutex_p之后,第二个线程才会被激活,然后调试第二线程,获取mutex_p.使用OS提供的互斥量来保护公共资源还是比较安全的,但如果用二值信号量的话,就可能会有优先级反转的情况.
打开App,查看更多内容
随时随地看视频慕课网APP