新聞中心
隨著計(jì)算機(jī)應(yīng)用環(huán)境的日益復(fù)雜,用戶(hù)對(duì)計(jì)算機(jī)系統(tǒng)的要求也變得越來(lái)越高,這就要求計(jì)算機(jī)系統(tǒng)必須能夠并發(fā)地處理各種任務(wù)。而線程便是實(shí)現(xiàn)并行處理的基本單元之一。不過(guò),由于線程是并發(fā)的,多線程程序的編寫(xiě)過(guò)程中,就需要考慮線程之間數(shù)據(jù)的同步問(wèn)題,否則就會(huì)導(dǎo)致數(shù)據(jù)混亂、死鎖等問(wèn)題。為解決這些問(wèn)題,就需要使用同步互斥鎖。

城關(guān)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!
1. 了解同步互斥鎖
同步互斥鎖是一種常用的線程同步機(jī)制,它可以確保在任意時(shí)刻只有一個(gè)線程執(zhí)行關(guān)鍵代碼段,保證代碼的互斥性。在Linux系統(tǒng)中,同步互斥鎖可以由pthread_mutex_t類(lèi)型的互斥鎖對(duì)象實(shí)現(xiàn)。當(dāng)一個(gè)線程需要使用共享數(shù)據(jù)時(shí),它必須先鎖定該互斥鎖,執(zhí)行完操作之后再釋放該互斥鎖,以允許其他線程繼續(xù)使用該共享數(shù)據(jù)。
2. 實(shí)現(xiàn)線程安全編程
線程安全的編程是指在多線程環(huán)境下保證程序正常運(yùn)行的能力。使用同步互斥鎖可以實(shí)現(xiàn)線程安全編程。在進(jìn)行線程編程時(shí),需要注意以下幾點(diǎn)。
(1)對(duì)于需要訪問(wèn)共享資源的變量,需要使用互斥鎖進(jìn)行保護(hù)。
(2)對(duì)于一組共享資源,可以使用一把互斥鎖進(jìn)行保護(hù),避免多個(gè)線程同時(shí)訪問(wèn)。
(3)在設(shè)計(jì)線程程序時(shí),需要注意“死鎖”問(wèn)題,即兩個(gè)或多個(gè)線程互相等待對(duì)方釋放鎖的情況。
(4)使用條件變量可以實(shí)現(xiàn)線程之間的通信,避免不必要的上鎖。
3. 代碼示例
下面是一個(gè)簡(jiǎn)單的示例代碼,演示了使用同步互斥鎖實(shí)現(xiàn)線程安全的方法。
“`
#include
#include
#include
typedef struct __counter_t { //定義計(jì)數(shù)器結(jié)構(gòu)體
int value;
pthread_mutex_t lock;
} counter_t;
void init(counter_t *c) { //初始化計(jì)數(shù)器
c->value = 0;
pthread_mutex_init(&c->lock, NULL);
}
void increment(counter_t *c) { //自增操作
pthread_mutex_lock(&c->lock); //上鎖
c->value++;
pthread_mutex_unlock(&c->lock); //解鎖
}
void decrement(counter_t *c) { //自減操作
pthread_mutex_lock(&c->lock); //上鎖
c->value–;
pthread_mutex_unlock(&c->lock); //解鎖
}
int get(counter_t *c) { //獲取計(jì)數(shù)器的值
pthread_mutex_lock(&c->lock); //上鎖
int val = c->value;
pthread_mutex_unlock(&c->lock); //解鎖
return val;
}
int mn(int argc, char *argv[]) {
counter_t c;
init(&c);
int i;
for (i = 0; i
increment(&c);
}
for (i = 0; i
decrement(&c);
}
printf(“FINAL VALUE: %d\n”, get(&c));
return 0;
}
“`
在這段代碼中,我們使用了一個(gè)計(jì)數(shù)器結(jié)構(gòu)體來(lái)管理計(jì)數(shù)器的值。在自增、自減、獲取計(jì)數(shù)器值的操作中,我們都使用了同步互斥鎖進(jìn)行保護(hù),以確保計(jì)數(shù)器的操作是線程安全的。此外,我們?cè)诔绦蜷_(kāi)頭還創(chuàng)建了一個(gè)互斥鎖對(duì)象并進(jìn)行初始化。
4.
相關(guān)問(wèn)題拓展閱讀:
- linux|進(jìn)程間通信如何加鎖
- 求教:線程同步和進(jìn)程同步有什么區(qū)別
- 淺談linux和windows的線程機(jī)制的區(qū)別
linux|進(jìn)程間通信如何加鎖
進(jìn)程間通信有一種方式,大家有沒(méi)有想過(guò),這種通信方式中如何解決數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題?我們可能自然而然的就會(huì)想到用鎖。但我們平時(shí)使用的鎖都是用于解決線程間數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題,貌似沒(méi)有看到過(guò)它用在進(jìn)程中,那怎么辦?
關(guān)于進(jìn)程間的通信方式估計(jì)大多數(shù)人都知道,這也是常見(jiàn)的面試八股文之一。
個(gè)人認(rèn)為這種面試題沒(méi)什么意義,無(wú)非就是答幾個(gè)關(guān)鍵詞而已,更深入的可能面試官和面試者都不太了解巖凱銷(xiāo)。
關(guān)于進(jìn)程間通信方式我之前在【這篇文章】中有過(guò)介紹,感興趣的可以移步去看哈。
進(jìn)程間通信有一種方式,大家有沒(méi)有想過(guò),這種通信方式中如何解決數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題?
我們可能自然而然的就會(huì)想到用鎖。但我們平時(shí)使用的鎖都是用于解決線程間數(shù)據(jù)粗游競(jìng)爭(zhēng)問(wèn)題,貌似沒(méi)有看到過(guò)它用在進(jìn)程中,那怎么辦?
我找到了兩種方法,信號(hào)量和互斥鎖。
直接給大家貼代碼吧,首先是信號(hào)量方式:
代碼中的MEOW_DEFER,它內(nèi)部的函數(shù)會(huì)在生命周期結(jié)束后觸發(fā)。它的核心函數(shù)其實(shí)就是下面這四個(gè):
具體含義大家應(yīng)該看孫禪名字就知道,這里的重點(diǎn)就是sem_init中的pshared參數(shù),該參數(shù)為1表示可在進(jìn)程間共享,為0表示只在進(jìn)程內(nèi)部共享。
第二種方式是使用鎖,即pthread_mutex_t,可是pthread_mutex不是用作線程間數(shù)據(jù)競(jìng)爭(zhēng)的嗎,怎么能用在進(jìn)程間呢?
可以給它配置一個(gè)屬性,示例代碼如下:
它的默認(rèn)屬性是進(jìn)程內(nèi)私有,但是如果給它配置成PTHREAD_PROCESS_SHARED,它就可以用在進(jìn)程間通信中。
相關(guān)視頻推薦
360度無(wú)死角講解進(jìn)程管理,調(diào)度器的5種實(shí)現(xiàn)
Linux進(jìn)程間通信-信號(hào)量、消息隊(duì)列和共享內(nèi)存
學(xué)習(xí)視頻教程-騰訊課堂
需要C/C++ Linux服務(wù)器架構(gòu)師學(xué)習(xí)資料加qun獲?。ㄙY料包括
C/C++,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg
等),免費(fèi)分享
完整代碼如下:
我想這兩種方式應(yīng)該可以滿(mǎn)足我們?nèi)粘i_(kāi)發(fā)過(guò)程中的大多數(shù)需求。
鎖的方式介紹完之后,可能很多朋友自然就會(huì)想到原子變量,這塊我也搜索了一下。但是也不太確定C++標(biāo)準(zhǔn)中的atomic是否在進(jìn)程間通信中有作用,不過(guò)看樣子boost中的atomic是可以用在進(jìn)程間通信中的。
其實(shí)在研究這個(gè)問(wèn)題的過(guò)程中,還找到了一些很多解決辦法,包括:
Disabling Interrupts
Lock Variables
Strict Alternation
Peterson’s Solution
The TSL Instruction
Sleep and Wakeup
Semaphores
Mutexes
Monitors
Message Passing
Barriers
求教:線程同步和進(jìn)程同步有什么區(qū)別
線程同步:多線程編程中,解決共享資源沖突的問(wèn)題
進(jìn)程同步畢虧:多進(jìn)程編程中,解決共享資源沖突的問(wèn)題
但是部分同學(xué)對(duì)線程同步和進(jìn)程同步研究得不夠深入,爛耐比如
互斥鎖
和條件變量能不能同時(shí)用于線程同步和進(jìn)程同步,本質(zhì)上有什么區(qū)別。
首先我們知道,linux下每個(gè)進(jìn)程都有自己的獨(dú)立進(jìn)程空間,假設(shè)A進(jìn)程和B進(jìn)程各有一個(gè)互斥鎖,這個(gè)鎖放在進(jìn)程的全局靜態(tài)區(qū),那么AB進(jìn)程都是無(wú)法感知對(duì)方的互斥鎖的。
互斥鎖和條件變量出自Posix.1線程標(biāo)準(zhǔn),它們總是可以用來(lái)同步一個(gè)進(jìn)程內(nèi)的各個(gè)線程的。如果一個(gè)互斥鎖或者條件變量存放在多個(gè)進(jìn)程共享的某個(gè)內(nèi)存區(qū)中,那么Posix還允許它用在這些進(jìn)程間的同步。饑數(shù)春
看到這里,是不是發(fā)現(xiàn)點(diǎn)了什么,線程同步和進(jìn)程同步的本質(zhì)區(qū)別在于鎖放在哪,放在私有的進(jìn)程空間還是放在多進(jìn)程共享的空間,并且看鎖是否具備進(jìn)程共享的屬性,
進(jìn)程至少包括一個(gè)主線程,還并物穗有工作線程
狹隘的講:線程通信就是進(jìn)程范圍內(nèi)主線程與工作線程 或者 工作線程之間的通信
進(jìn)程通信,是進(jìn)程A(可以理絕卜解為主線程) 與 進(jìn)程B(可以理解為主線程)之螞型間的通信
淺談linux和windows的線程機(jī)制的區(qū)別
–
轉(zhuǎn)載自fychit創(chuàng)意空間 早前想寫(xiě)寫(xiě)linux線程編程windows線程編程每寫(xiě)知道哪寫(xiě)起自知道東西都寫(xiě)面我談?wù)刲inux線程及線程同步并windows線程進(jìn)行比較看看間相同點(diǎn)同
其實(shí)始我搞windows編程包括windows編程windows 驅(qū)包括u驅(qū)ndis驅(qū),pci驅(qū)1394驅(qū)等等同條龍服務(wù)做windows應(yīng)用程序發(fā)面慢慢我linux發(fā)產(chǎn)比較深興趣轉(zhuǎn)搞linux發(fā)接我寫(xiě)些博客主要寫(xiě)linux編程windows編程區(qū)別吧現(xiàn)想寫(xiě)linuxu驅(qū)windowsu驅(qū)發(fā)區(qū)別些都等我linux線程windows線程講解完我再寫(xiě)篇u驅(qū)談?wù)剋indows linux u驅(qū)東東言歸傳始線程
首先我講講要采用線程編程其實(shí)并所程序都必須采用線程些候采用線程性能沒(méi)單線程所我要搞清楚候采用線程采用線程處:
(1)線程彼間采用相同址空間共享部數(shù)據(jù)進(jìn)程相比代價(jià)比較節(jié)儉進(jìn)程啟新進(jìn)程必須配給獨(dú)立址空間需要數(shù)據(jù)表維護(hù)代數(shù)雀碼段數(shù)據(jù)段堆棧段等等
(2)線程進(jìn)程相比明顯優(yōu)點(diǎn)線程間通信同進(jìn)程說(shuō)具獨(dú)立數(shù)據(jù)空間要進(jìn)行數(shù)據(jù)傳遞能通通信式進(jìn)行種式僅費(fèi)且便于線程間直接共享數(shù)據(jù)比簡(jiǎn)單式共享全局變量共享全部變量要注意哦呵呵必須注意同步知道呵呵
(3)cpu情況同線程運(yùn)行同cpu完全并行
反我覺(jué)種情況采用線程比較理想比說(shuō)要做任務(wù)2步驟提高工作效率線程技術(shù)辟2線程第線程做第步工作第2線程做第2步工作候要注意同步第步做完才能做第2步工作我采用同步技術(shù)進(jìn)行線程間通信
針?lè)N情況我首先講講線程間通信windows平臺(tái)線程間通信采用主要:
(1)共享全局變量,種容易想呵呵首先講講吧比說(shuō)吧面問(wèn)題第步要向第2步傳扒游遞收據(jù)我間共享全局變量讓兩線程間傳遞數(shù)據(jù)主要考慮同步面線程數(shù)據(jù)進(jìn)行操作候第線程改變數(shù)據(jù)內(nèi)容同步保護(hù)嚴(yán)重知道種情況讀臟數(shù)據(jù)種情況我容易想同步設(shè)置bool flag比說(shuō)第2線程沒(méi)用完數(shù)據(jù)前第線程能寫(xiě)入2線程所需間相同候達(dá)效率同步比較麻煩咱幾緩沖區(qū)進(jìn)行操作像產(chǎn)者消費(fèi)者2線程直跑由于間致緩沖區(qū)遲早溢種情況要考慮讓數(shù)據(jù)寫(xiě)入讓數(shù)據(jù)覆蓋掉數(shù)據(jù)候要具體問(wèn)題具體析打住呵呵用bool變量控制同步linux windows
既講道再講講其同步同 針面問(wèn)題共享全局變量同步問(wèn)題除采用bool變量外容易想互斥量呵呵傳說(shuō)加鎖windows加鎖linux加鎖類(lèi)似采用互斥量進(jìn)行同步要想進(jìn)入段代碼先必須獲互斥量
linux互斥量函數(shù):
windows互斥量函數(shù):createmutex 創(chuàng)建互斥量獲互斥量waitforsingleobject函數(shù)用完釋放互斥量ReleaseMutex(hMutex)減0候 內(nèi)核才釋放其象面windows與互斥幾函數(shù)原型
HANDLE WINAPI CreateMutex(
__in LPSECURITY_ATTRIBUTES lpMutexAttributes,
__in BOOL bInitialOwner,
__in LPCTSTR lpName
);
用創(chuàng)建名或名互斥量象
第參數(shù) 指向結(jié)構(gòu)體SECURITY_ATTRIBUTES 般設(shè)null;
第二參數(shù) 指函數(shù)應(yīng)應(yīng)狀態(tài) FALSE前擁者創(chuàng)建互斥
第三參數(shù) 指明否名互斥象 名 用null
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
第 創(chuàng)建互斥象句柄第二 表示少間返 設(shè)宏INFINITE 則返 直用戶(hù)自定義返
于linux操作系統(tǒng)互斥類(lèi)似函數(shù)同罷linux互斥春畢銷(xiāo)相關(guān)幾函數(shù)要閃亮登場(chǎng)
pthread_mutex_init函數(shù):初始化互斥鎖;
pthread_mutex_destroy函數(shù):注銷(xiāo)互斥鎖;
pthread_mutex_lock函數(shù):加鎖功阻塞等待;
pthread_mutex_unlock函數(shù):解鎖;
pthread_mutex_trylock函數(shù):測(cè)試加鎖功立即返錯(cuò)誤碼EBUSY;
至于些函數(shù)用google搜呵呵講windows用保護(hù)數(shù)據(jù)線程同步式
臨界區(qū)臨界區(qū)互斥類(lèi)似間區(qū)別臨界區(qū)速度快能用同步同進(jìn)程內(nèi)線程臨界區(qū)獲取釋放函數(shù):
EnterCriticalSection() 進(jìn)入臨界區(qū); LeaveCriticalSection()離臨界區(qū) 于線程共享內(nèi)存東東講
(2)采用消息機(jī)制進(jìn)行線程通信同步windows面消息機(jī)制函數(shù)用postmessageLinux消息機(jī)制我用較少說(shuō)誰(shuí)熟悉告訴我呵呵
(3)windows另外種線程通信事件信號(hào)量同針我始舉例2線程同步間傳遞信息采用事件(Event)或信號(hào)量(Semaphore),比第線程完產(chǎn)數(shù)據(jù)必須告訴第2線程已經(jīng)數(shù)據(jù)準(zhǔn)備取走第2線程數(shù)據(jù)取走呵呵采用消息機(jī)制第線程準(zhǔn)備數(shù)據(jù)直接postmessage給第2線程按理說(shuō)采用postmessage線程搞定問(wèn)題呵呵重點(diǎn)省略講
于linux類(lèi)似條件變量呵呵windowslinux同要特別講講才行
于windows采用事件信號(hào)量同步候都使用waitforsingleobject進(jìn)行等待函數(shù)第參數(shù)句柄Event句柄或Semaphore句柄第2參數(shù)等待延遲終等久單位ms參數(shù)INFINITE限等待釋放信號(hào)量函數(shù)ReleaseSemaphore();釋放事件函數(shù)SetEvent使用些東西都要初始化講Msdn搜神馬都呵呵神馬都浮云
于linux操作系統(tǒng)采用條件變量實(shí)現(xiàn)類(lèi)似功能Linux條件變量般都互斥鎖起使用主要函數(shù):
pthread_mutex_lock ,
pthread_mutex_unlock,
pthread_cond_init
pthread_cond_signal
pthread_cond_wait
pthread_cond_timewait
關(guān)于linux 同步互斥鎖的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專(zhuān)業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專(zhuān)注成都高端網(wǎng)站建設(shè)定制開(kāi)發(fā)服務(wù),為客戶(hù)提供專(zhuān)業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開(kāi)發(fā),營(yíng)銷(xiāo)網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
新聞標(biāo)題:了解Linux同步互斥鎖,實(shí)現(xiàn)線程安全的編程 (linux 同步互斥鎖)
本文來(lái)源:http://m.fisionsoft.com.cn/article/cccjgch.html


咨詢(xún)
建站咨詢(xún)
