亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

程序如下:個人理解的下面的程序應該產生死鎖?

程序如下:個人理解的下面的程序應該產生死鎖?

C
30秒到達戰場 2023-03-02 18:14:23
#include <stdlib.h>#include <pthread.h>#include <stdio.h>struct msg{struct msg *next;int num;};struct msg *head;pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void *consumer(void *p){struct msg *mp;while(1){pthread_mutex_lock(&lock); //1 : 消費者先加鎖printf("consumer is lock.\n");while(NULL == head){pthread_cond_wait(&has_product,&lock); //2: 消費者循環等待}mp = head;head = mp->next;pthread_mutex_unlock(&lock); //3:消費者釋放鎖printf("consumer is unlock.\n");printf("Consume %d\n",mp->num);free(mp);sleep(rand() % 5);}}void *producer(void *p){struct msg *mp;while(1){mp = malloc(sizeof(struct msg));mp->num = rand() % 1000 + 1;printf("Produce %d\n",mp->num);pthread_mutex_lock(&lock); //4:生產者加鎖,但此時消費者并未釋放鎖,但此處卻加鎖成功了???printf("producer is lock.\n");mp->next = head;head = mp;pthread_mutex_unlock(&lock); //5:生產者釋放鎖printf("producer is unlock.\n");pthread_cond_signal(&has_product);sleep(rand() % 5);}}int main(int argc, char *argv[]){pthread_t pid,cid;srand(time(NULL));pthread_create(&cid,NULL,consumer,NULL); //6:讓消費者先運行,加鎖,然后進入循環等待狀態sleep(3);pthread_create(&pid,NULL,producer,NULL);  pthread_join(pid,NULL);pthread_join(cid,NULL);return 0;}測試輸出:consumer is lock. //此處已經加鎖Produce 728producer is lock. //此處鎖并未釋放,但卻獲得了鎖,為什么呢???producer is unlock.consumer is unlock.Consume 728Produce 630producer is lock.producer is unlock.consumer is lock.consumer is unlock.Consume 630consumer is lock.
查看完整描述

1 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

環等待其實是這樣的:檢查條件滿不滿足,不滿足就解鎖,然后等,等到了要檢測的時候,又上鎖,然后檢查,不滿足就解鎖。
也就是說,進了pthread_cond_wait函數以后,它就釋放了lock,然后在has_product上等待,等到has_product被觸發了,就再上鎖,然后出函數。你的消費者線程調用了pthread_cond_wait以后,就釋放了鎖,然后這個函數不返回(這個函數不返回你的代碼就不會運行下去),等到has_product觸發了,這個函數就獲取鎖,然后返回。
再解釋一下,就是調用這個函數之前,你這個線程是拿到鎖的;出了這個函數,你的線程也還是拿到鎖的;但是進了這個函數還沒出來的過程中,你的線程會釋放鎖。

查看完整回答
反對 回復 2023-03-06
  • 1 回答
  • 0 關注
  • 84 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號