日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux全局變量加鎖,保證線程安全 (linux全局變量加鎖)

在多線程程序中,保證資源的共享和訪問安全是非常重要的。如果多個線程同時訪問一個共享資源,很容易出現(xiàn)競爭條件(Race Condition)和數(shù)據(jù)沖突(Data Race)等問題,導(dǎo)致程序出現(xiàn)不可預(yù)料的行為。因此,在編寫多線程程序時,需要采取一些措施來保證共享資源的訪問安全。本文將介紹Linux系統(tǒng)中如何通過鎖機(jī)制來保護(hù)全局變量,保證多個線程對變量的訪問是安全的。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了興山免費建站歡迎大家使用!

一、全局變量與線程安全

全局變量是指在整個程序執(zhí)行期間都可見和訪問的變量,它們通常定義在函數(shù)外部。全局變量既可以在單線程程序中使用,也可以在多線程程序中使用。不過,在多線程程序中,由于多個線程可以同時訪問全局變量,會產(chǎn)生一些問題。

例如,假設(shè)有一個全局變量g_count,表示某個任務(wù)的計數(shù)器。如果在一個線程中使用g_count進(jìn)行自增操作,那么另外一個線程也可能在同一時刻對g_count進(jìn)行自增操作。由于自增操作包括讀取原值和寫入新值兩個過程,多個線程同時進(jìn)行自增操作就可能產(chǎn)生競爭條件,導(dǎo)致g_count的值出現(xiàn)錯誤。比如,線程1讀取g_count的值為10,線程2也讀取g_count的值為10,然后線程1對g_count的值加1得到11,緊接著線程2也對g_count的值加1得到11,此時g_count的值應(yīng)該是12,但實際上卻是11。

為了避免這樣的問題,需要對全局變量進(jìn)行加鎖。多個線程在訪問全局變量時,必須獲得鎖,然后才能對變量進(jìn)行讀寫操作。這樣可以保證任何時刻只有一個線程可以訪問全局變量,從而避免競爭條件和數(shù)據(jù)沖突等問題。

二、Linux中的鎖機(jī)制

Linux系統(tǒng)提供了多種鎖機(jī)制,用來保護(hù)共享資源的訪問安全。常用的鎖機(jī)制包括:互斥鎖、讀寫鎖、自旋鎖等。

互斥鎖是一種最常用的鎖機(jī)制。它可以保證同一時刻只有一個線程可以進(jìn)入臨界區(qū),進(jìn)入臨界區(qū)的線程需要先獲得互斥鎖,執(zhí)行完臨界區(qū)的操作后釋放互斥鎖,其他線程才有機(jī)會進(jìn)入臨界區(qū)。互斥鎖有兩種狀態(tài):鎖定和未鎖定。當(dāng)一個線程獲得了互斥鎖時,該鎖處于鎖定狀態(tài),其他線程需要等待該鎖的釋放才能進(jìn)入臨界區(qū)。當(dāng)一個線程釋放了互斥鎖時,該鎖變?yōu)槲存i定狀態(tài),其他線程可以搶占該鎖進(jìn)入臨界區(qū)。

讀寫鎖是一種用于提高讀操作并發(fā)性的鎖機(jī)制。它可以有多個讀者同時訪問臨界區(qū),但只有一個寫者可以訪問臨界區(qū)。當(dāng)存在寫者時,所有讀者和其他寫者都需要等待鎖的釋放。讀寫鎖有兩種狀態(tài):讀鎖和寫鎖。當(dāng)一個線程獲得了讀鎖時,它可以進(jìn)行讀操作但不能進(jìn)行寫操作;當(dāng)一個線程獲得了寫鎖時,它可以進(jìn)行寫操作但不能進(jìn)行讀操作。

自旋鎖是一種非常輕量級的鎖機(jī)制。它可以消除線程調(diào)度帶來的性能開銷,適用于高并發(fā)場景。自旋鎖的鎖定狀態(tài)是通過忙等待實現(xiàn)的,即一個線程在獲取鎖時,如果發(fā)現(xiàn)鎖已經(jīng)被其他線程占用,就不斷地循環(huán)檢查鎖的狀態(tài),直到鎖被釋放。這種機(jī)制可以避免線程的上下文切換,提高了程序的性能。

三、使用互斥鎖保護(hù)全局變量

下面是一個示例程序,演示如何使用互斥鎖保護(hù)全局變量,保證多線程對變量的訪問安全。

“`c

#include

#include

pthread_mutex_t g_mutex; // 全局互斥鎖

int g_count = 0; // 全局計數(shù)器

void* thread_func(void* arg) // 線程處理函數(shù)

{

int i;

for (i = 0; i

pthread_mutex_lock(&g_mutex); // 獲得互斥鎖

g_count++; // 對全局變量進(jìn)行加1操作

pthread_mutex_unlock(&g_mutex); // 釋放互斥鎖

}

return NULL;

}

int mn()

{

pthread_t tid1, tid2; // 線程ID

pthread_mutex_init(&g_mutex, NULL); // 初始化互斥鎖

pthread_create(&tid1, NULL, thread_func, NULL); // 創(chuàng)建線程1

pthread_create(&tid2, NULL, thread_func, NULL); // 創(chuàng)建線程2

pthread_join(tid1, NULL); // 等待線程1退出

pthread_join(tid2, NULL); // 等待線程2退出

pthread_mutex_destroy(&g_mutex); // 銷毀互斥鎖

printf(“g_count = %d\n”, g_count); // 輸出全局計數(shù)器的值

return 0;

}

“`

在這個示例程序中,我們定義了一個全局互斥鎖g_mutex和一個全局計數(shù)器g_count。線程處理函數(shù)thread_func會對g_count進(jìn)行100000次加1操作,每次操作都會獲得互斥鎖并更新g_count,然后釋放互斥鎖。主函數(shù)中創(chuàng)建了兩個線程來執(zhí)行thread_func,執(zhí)行完畢后輸出g_count的值。

運行程序,可以看到輸出的g_count值為202300,說明多線程對全局變量的訪問是安全的。

四、

相關(guān)問題拓展閱讀:

  • linux|進(jìn)程間通信如何加鎖

linux|進(jìn)程間通信如何加鎖

進(jìn)程間通信有一種方式,大家有沒有想過,這種通信方式中如何解決數(shù)據(jù)競爭問題?我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用于解決線程間數(shù)據(jù)競爭問題,貌似沒有看到過它用在進(jìn)程中,那怎么辦?

關(guān)于進(jìn)程間的通信方式估計大多數(shù)人都知道,這也是常見的面試八股文之一。

個人認(rèn)為這種面試題沒什么意義,無非就是答幾個關(guān)鍵詞而已,更深入的可能面試官和面試者都不太了解巖凱銷。

關(guān)于進(jìn)程間通信方式我之前在【這篇文章】中有過介紹,感興趣的可以移步去看哈。

進(jìn)程間通信有一種方式,大家有沒有想過,這種通信方式中如何解決數(shù)據(jù)競爭問題?

我們可能自然而然的就會想到用鎖。但我們平時使用的鎖都是用于解決線程間數(shù)據(jù)粗游競爭問題,貌似沒有看到過它用在進(jìn)程中,那怎么辦?

我找到了兩種方法,信號量和互斥鎖。

直接給大家貼代碼吧,首先是信號量方式:

代碼中的MEOW_DEFER,它內(nèi)部的函數(shù)會在生命周期結(jié)束后觸發(fā)。它的核心函數(shù)其實就是下面這四個:

具體含義大家應(yīng)該看孫禪名字就知道,這里的重點就是sem_init中的pshared參數(shù),該參數(shù)為1表示可在進(jìn)程間共享,為0表示只在進(jìn)程內(nèi)部共享。

第二種方式是使用鎖,即pthread_mutex_t,可是pthread_mutex不是用作線程間數(shù)據(jù)競爭的嗎,怎么能用在進(jìn)程間呢?

可以給它配置一個屬性,示例代碼如下:

它的默認(rèn)屬性是進(jìn)程內(nèi)私有,但是如果給它配置成PTHREAD_PROCESS_SHARED,它就可以用在進(jìn)程間通信中。

相關(guān)視頻推薦

360度無死角講解進(jìn)程管理,調(diào)度器的5種實現(xiàn)

Linux進(jìn)程間通信-信號量、消息隊列和共享內(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

等),免費分享

完整代碼如下:

我想這兩種方式應(yīng)該可以滿足我們?nèi)粘i_發(fā)過程中的大多數(shù)需求。

鎖的方式介紹完之后,可能很多朋友自然就會想到原子變量,這塊我也搜索了一下。但是也不太確定C++標(biāo)準(zhǔn)中的atomic是否在進(jìn)程間通信中有作用,不過看樣子boost中的atomic是可以用在進(jìn)程間通信中的。

其實在研究這個問題的過程中,還找到了一些很多解決辦法,包括:

Disabling Interrupts

Lock Variables

Strict Alternation

Peterson’s Solution

The TSL Instruction

Sleep and Wakeup

Semaphores

Mutexes

Monitors

Message Passing

Barriers

關(guān)于linux全局變量加鎖的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機(jī)房服務(wù)器托管租用。


分享標(biāo)題:Linux全局變量加鎖,保證線程安全 (linux全局變量加鎖)
URL標(biāo)題:http://www.dlmjj.cn/article/dhogjsh.html