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

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


咨詢
建站咨詢
