国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

幾十元做網(wǎng)站營(yíng)銷團(tuán)隊(duì)找產(chǎn)品合作

幾十元做網(wǎng)站,營(yíng)銷團(tuán)隊(duì)找產(chǎn)品合作,縉云縣城鄉(xiāng)建設(shè)局網(wǎng)站,自助建站編輯器一、臨界資源與臨界區(qū) 多線程會(huì)共享例如全局變量等資源&#xff0c;我們把會(huì)被多個(gè)執(zhí)行流訪問(wèn)的資源稱為臨界資源&#xff0c;我們是通過(guò)代碼訪問(wèn)臨界資源的&#xff0c;而我們?cè)L問(wèn)臨界資源的那部分代碼稱為臨界區(qū)。 實(shí)現(xiàn)一個(gè)搶票系統(tǒng) 只有一個(gè)線程搶票時(shí) #include <ios…

一、臨界資源與臨界區(qū)

多線程會(huì)共享例如全局變量等資源,我們把會(huì)被多個(gè)執(zhí)行流訪問(wèn)的資源稱為臨界資源,我們是通過(guò)代碼訪問(wèn)臨界資源的,而我們?cè)L問(wèn)臨界資源的那部分代碼稱為臨界區(qū)。

實(shí)現(xiàn)一個(gè)搶票系統(tǒng)

只有一個(gè)線程搶票時(shí)

#include <iostream>
#include <vector>
#include <unistd.h>#include "Thread.hpp"int num = 10000; std::string GetThreadName()
{static int num = 1;char name[64];snprintf(name, sizeof(name), "thread-%d", num++);return name;
}void Ticket(std::string name)
{while(true){if(num > 0){usleep(1000);printf("%s get ticket: %d\n", name.c_str(), num);num--;}else{break;}}
}int main()
{std::string name1 = GetThreadName();Thread<std::string> t1(name1, Ticket, name1);t1.Start();t1.Join();return 0;
}

正常輸出,最終票數(shù)為0時(shí)退出。

但是當(dāng)我們啟動(dòng)多個(gè)線程同時(shí)搶票時(shí),num就是臨界資源,使用num的那部分代碼就是臨界區(qū)

#include <iostream>
#include <vector>
#include <unistd.h>#include "Thread.hpp"int num = 10000; std::string GetThreadName()
{static int num = 1;char name[64];snprintf(name, sizeof(name), "thread-%d", num++);return name;
}void Ticket(std::string name)
{while(true){if(num > 0){usleep(1000);printf("%s get ticket: %d\n", name.c_str(), num);num--;}else{break;}}
}int main()
{std::string name1 = GetThreadName();Thread<std::string> t1(name1, Ticket, name1);std::string name2 = GetThreadName();Thread<std::string> t2(name2, Ticket, name2);std::string name3 = GetThreadName();Thread<std::string> t3(name3, Ticket, name3);std::string name4 = GetThreadName();Thread<std::string> t4(name4, Ticket, name4);t1.Start();t2.Start();t3.Start();t4.Start();t1.Join();t2.Join();t3.Join();t4.Join();return 0;
}

可以看到出現(xiàn)了0和負(fù)數(shù)的票數(shù),這是因?yàn)楫?dāng)票數(shù)只剩1時(shí),有多個(gè)執(zhí)行流在同一時(shí)間通過(guò)了if判斷,使得能繼續(xù)進(jìn)行減票操作。

vs下自減操作的反匯編,分為三步:先從內(nèi)存拿數(shù)據(jù),再把數(shù)據(jù)減1,最后把數(shù)據(jù)拷貝到內(nèi)存

多個(gè)執(zhí)行流同時(shí)訪問(wèn)臨界資源例如自減操作,由于--操作不是原子性的(我們認(rèn)為一條匯編指令是原子性的,是不會(huì)被中斷的。但--操作轉(zhuǎn)為匯編指令后,需要多條指令才能完成),當(dāng)--操作執(zhí)行到一半切換到其他線程會(huì)導(dǎo)致數(shù)據(jù)不一致的問(wèn)題。這種情況下需要通過(guò)鎖把臨界區(qū)保護(hù)起來(lái),每次只讓一個(gè)執(zhí)行流訪問(wèn)臨界資源,避免數(shù)據(jù)不一致問(wèn)題。

互斥:任何時(shí)刻,互斥保證有且只有一個(gè)執(zhí)行流進(jìn)入臨界區(qū),訪問(wèn)臨界資源,通常對(duì)臨界資源起保護(hù)作用。

原子性:不會(huì)被任何調(diào)度機(jī)制打斷的操作,該操作只有兩態(tài),要么完成,要么未完成。

二、使用鎖的方法

1.創(chuàng)建鎖

如果定義一個(gè)全局的鎖,直接使用pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER用宏初始化。

如果定義一個(gè)局部鎖,要使用pthread_mutex_init方法創(chuàng)建,參數(shù)attr設(shè)為nullptr

2.加鎖解鎖

使用pthread_mutex_lock加鎖,傳遞鎖的地址,

解鎖用pthread_mutex_unlock

當(dāng)我們使用鎖后,就能保證每次只有一個(gè)執(zhí)行流能訪問(wèn)臨界資源。

#include <iostream>
#include <vector>
#include <unistd.h>#include "Thread.hpp"int num = 10000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //定義一個(gè)全局鎖std::string GetThreadName()
{static int num = 1;char name[64];snprintf(name, sizeof(name), "thread-%d", num++);return name;
}void Ticket(std::string name)
{while(true){pthread_mutex_lock(&mutex); //加鎖if(num > 0){usleep(1000);printf("%s get ticket: %d\n", name.c_str(), num);num--;pthread_mutex_unlock(&mutex); //解鎖}else{pthread_mutex_unlock(&mutex); //解鎖break;}}
}int main()
{std::string name1 = GetThreadName();Thread<std::string> t1(name1, Ticket, name1);std::string name2 = GetThreadName();Thread<std::string> t2(name2, Ticket, name2);std::string name3 = GetThreadName();Thread<std::string> t3(name3, Ticket, name3);std::string name4 = GetThreadName();Thread<std::string> t4(name4, Ticket, name4);t1.Start();t2.Start();t3.Start();t4.Start();t1.Join();t2.Join();t3.Join();t4.Join();return 0;
}

結(jié)果正常,但是速度慢了很多,因?yàn)橐粩嗌暾?qǐng)鎖和釋放鎖

加鎖解鎖的過(guò)程是安全的

三、可重入和線程安全

1.概念

線程安全:多個(gè)線程并發(fā)同一段代碼時(shí),不會(huì)出現(xiàn)不同的結(jié)果。常見(jiàn)對(duì)全局變量或者靜態(tài)變量進(jìn)行操作, 并且沒(méi)有鎖保護(hù)的情況下,會(huì)出現(xiàn)該問(wèn)題。

重入:同一個(gè)函數(shù)被不同的執(zhí)行流調(diào)用,當(dāng)前一個(gè)流程還沒(méi)有執(zhí)行完,就有其他的執(zhí)行流再次進(jìn)入,我們稱之為重入。一個(gè)函數(shù)在重入的情況下,運(yùn)行結(jié)果不會(huì)出現(xiàn)任何不同或者任何問(wèn)題,則該函數(shù)被稱為可重入函數(shù),否則,是不可重入函數(shù)。

2.常見(jiàn)的線程不安全的情況

1.不保護(hù)共享變量的函數(shù)

2.函數(shù)狀態(tài)隨著被調(diào)用,狀態(tài)發(fā)生變化的函數(shù)

3.返回指向靜態(tài)變量指針的函數(shù)

4.調(diào)用線程不安全函數(shù)的函數(shù)

3.常見(jiàn)的線程安全的情況

1.調(diào)用了malloc/free函數(shù),因?yàn)閙alloc函數(shù)是用全局鏈表來(lái)管理堆的

2.調(diào)用了標(biāo)準(zhǔn)I/O庫(kù)函數(shù),標(biāo)準(zhǔn)I/O庫(kù)的很多實(shí)現(xiàn)都以不可重入的方式使用全局?jǐn)?shù)據(jù)結(jié)構(gòu)

3.可重入函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結(jié)構(gòu)

4.常見(jiàn)可重入的情況

1.不使用全局變量或靜態(tài)變量

2.不使用用malloc或者new開(kāi)辟出的空間

3.不調(diào)用不可重入函數(shù)不返回靜態(tài)或全局?jǐn)?shù)據(jù),所有數(shù)據(jù)都有函數(shù)的調(diào)用者提供

4.使用本地?cái)?shù)據(jù),或者通過(guò)制作全局?jǐn)?shù)據(jù)的本地拷貝來(lái)保護(hù)全局?jǐn)?shù)據(jù)

5.可重入與線程安全聯(lián)系

1.函數(shù)是可重入的,那就是線程安全的

2.函數(shù)是不可重入的,那就不能由多個(gè)線程使用,有可能引發(fā)線程安全問(wèn)題

3.如果一個(gè)函數(shù)中有全局變量,那么這個(gè)函數(shù)既不是線程安全也不是可重入的。

6.可重入與線程安全區(qū)別

1.可重入函數(shù)是線程安全函數(shù)的一種

2.線程安全不一定是可重入的,而可重入函數(shù)則一定是線程安全的。

3.如果將對(duì)臨界資源的訪問(wèn)加上鎖,則這個(gè)函數(shù)是線程安全的,但如果這個(gè)重入函數(shù)若鎖還未釋放則會(huì)產(chǎn)生 死鎖,因此是不可重入的。

四、死鎖

死鎖是指在一組進(jìn)程中的各個(gè)進(jìn)程均占有不會(huì)釋放的資源,但因互相申請(qǐng)被其他進(jìn)程所站用不會(huì)釋放的資源而處于的一種永久等待狀態(tài)。

1.死鎖四個(gè)必要條件

1.互斥條件:一個(gè)資源每次只能被一個(gè)執(zhí)行流使用

2.請(qǐng)求與保持條件:一個(gè)執(zhí)行流因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放

3.不剝奪條件: 一個(gè)執(zhí)行流已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪

4.循環(huán)等待條件: 若干執(zhí)行流之間形成一種頭尾相接的循環(huán)等待資源的關(guān)系

2.避免死鎖

1.破壞死鎖的四個(gè)必要條件

2.加鎖順序一致

3.避免鎖未釋放的場(chǎng)景

4.資源一次性分配

3.避免死鎖算法

1.死鎖檢測(cè)算法

2.銀行家算法

一個(gè)鎖會(huì)造成死鎖嗎?

答案是會(huì)的,當(dāng)一個(gè)線程申請(qǐng)完一個(gè)鎖,訪問(wèn)完臨界資源后,接下來(lái)該釋放鎖了,但是代碼卻寫成了加鎖,這就會(huì)導(dǎo)致死鎖問(wèn)題。

http://aloenet.com.cn/news/41355.html

相關(guān)文章:

  • 如何做泛解析網(wǎng)站百度知道怎么賺錢
  • wordpress建站教程主題推廣手段
  • 醫(yī)療美容培訓(xùn)網(wǎng)站建設(shè)站長(zhǎng)之家關(guān)鍵詞挖掘工具
  • 為某網(wǎng)站做網(wǎng)站推廣策劃方案制作網(wǎng)站的工具
  • 網(wǎng)站上名片如何做鄭州網(wǎng)站推廣報(bào)價(jià)
  • 廈門做網(wǎng)頁(yè)網(wǎng)站的公司企業(yè)官網(wǎng)建站
  • 老年大學(xué)網(wǎng)站建設(shè)網(wǎng)絡(luò)軟文
  • 手機(jī)兼職賺錢平臺(tái)飛豬關(guān)鍵詞排名優(yōu)化
  • 叢臺(tái)企業(yè)做網(wǎng)站推廣成人英語(yǔ)培訓(xùn)班哪個(gè)機(jī)構(gòu)好
  • 個(gè)人建網(wǎng)站教程seo工資多少
  • 做哪些網(wǎng)站不受法律保護(hù)廣告設(shè)計(jì)與制作
  • 畢業(yè)設(shè)計(jì)網(wǎng)站設(shè)計(jì)說(shuō)明書(shū)寧波seo免費(fèi)優(yōu)化軟件
  • 金川做網(wǎng)站公司網(wǎng)絡(luò)推廣代運(yùn)營(yíng)公司
  • 免費(fèi)建站自己的網(wǎng)址域名注冊(cè)查詢官網(wǎng)
  • 網(wǎng)站建設(shè)好以后怎么管理百度關(guān)鍵詞搜索量統(tǒng)計(jì)
  • 數(shù)據(jù)庫(kù)網(wǎng)站制作北京seo推廣系統(tǒng)
  • 搜索引擎優(yōu)化大致包含哪些內(nèi)容或環(huán)節(jié)河北seo推廣公司
  • 建一個(gè)素材網(wǎng)站多少錢杭州網(wǎng)站制作排名
  • 廣州市荔灣區(qū)疫情最新消息重慶可靠的關(guān)鍵詞優(yōu)化研發(fā)
  • 可以做婚禮鮮花布置的網(wǎng)站外貿(mào)推廣平臺(tái)哪個(gè)好
  • 工業(yè)企業(yè)網(wǎng)站建設(shè)費(fèi)教育培訓(xùn)網(wǎng)站官網(wǎng)
  • 寶安網(wǎng)站制作公司合肥網(wǎng)絡(luò)seo推廣服務(wù)
  • wordpress圖片站點(diǎn)網(wǎng)站制作網(wǎng)站推廣
  • it培訓(xùn)網(wǎng)站模板seo小白入門教學(xué)
  • 做棋牌網(wǎng)站建設(shè)哪家便宜免費(fèi)數(shù)據(jù)查詢網(wǎng)站
  • 免費(fèi)網(wǎng)站制作案例汽車宣傳軟文
  • 微擎如何做網(wǎng)站百度我的訂單app
  • 網(wǎng)站開(kāi)發(fā)用python嗎推廣策劃方案范文
  • 做網(wǎng)站要錢嗎sem優(yōu)化公司
  • 北京新冠最新情況最新消息百度seo2022新算法更新