第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

程序如下:個(gè)人理解的下面的程序應(yīng)該產(chǎn)生死鎖?

程序如下:個(gè)人理解的下面的程序應(yīng)該產(chǎn)生死鎖?

#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 : 消費(fèi)者先加鎖printf("consumer is lock.\n");while(NULL == head){pthread_cond_wait(&has_product,&lock); //2: 消費(fèi)者循環(huán)等待}mp = head;head = mp->next;pthread_mutex_unlock(&lock); //3:消費(fèi)者釋放鎖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:生產(chǎn)者加鎖,但此時(shí)消費(fèi)者并未釋放鎖,但此處卻加鎖成功了???printf("producer is lock.\n");mp->next = head;head = mp;pthread_mutex_unlock(&lock); //5:生產(chǎn)者釋放鎖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:讓消費(fèi)者先運(yùn)行,加鎖,然后進(jìn)入循環(huán)等待狀態(tài)sleep(3);pthread_create(&pid,NULL,producer,NULL);  pthread_join(pid,NULL);pthread_join(cid,NULL);return 0;}測(cè)試輸出:consumer is lock. //此處已經(jīng)加鎖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貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

環(huán)等待其實(shí)是這樣的:檢查條件滿不滿足,不滿足就解鎖,然后等,等到了要檢測(cè)的時(shí)候,又上鎖,然后檢查,不滿足就解鎖。
也就是說(shuō),進(jìn)了pthread_cond_wait函數(shù)以后,它就釋放了lock,然后在has_product上等待,等到has_product被觸發(fā)了,就再上鎖,然后出函數(shù)。你的消費(fèi)者線程調(diào)用了pthread_cond_wait以后,就釋放了鎖,然后這個(gè)函數(shù)不返回(這個(gè)函數(shù)不返回你的代碼就不會(huì)運(yùn)行下去),等到has_product觸發(fā)了,這個(gè)函數(shù)就獲取鎖,然后返回。
再解釋一下,就是調(diào)用這個(gè)函數(shù)之前,你這個(gè)線程是拿到鎖的;出了這個(gè)函數(shù),你的線程也還是拿到鎖的;但是進(jìn)了這個(gè)函數(shù)還沒(méi)出來(lái)的過(guò)程中,你的線程會(huì)釋放鎖。

查看完整回答
反對(duì) 回復(fù) 2023-03-06
  • 1 回答
  • 0 關(guān)注
  • 91 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)