日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
深入理解Linux多線程編程中的全局變量問(wèn)題(linux多線程全局變量)

Linux 多線程編程是一種復(fù)雜的編程方式,它與傳統(tǒng)的單線程編程方式有著明顯的不同。在多線程編程中,一個(gè)程序可以同時(shí)執(zhí)行多個(gè)任務(wù),這些任務(wù)可以在一個(gè)或者多個(gè)進(jìn)程間進(jìn)行切換。但是,多線程編程也面臨著許多挑戰(zhàn),比如全局變量數(shù)據(jù)共享問(wèn)題。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比靖西網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式靖西網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋靖西地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。

在本文中,我們將探討在 Linux 多線程編程中的全局變量問(wèn)題,包括定義全局變量、全局變量的作用域以及如何合理使用全局變量。

定義全局變量

在多線程編程中,我們通常需要在不同的線程享數(shù)據(jù)。全局變量是一種最常用的共享數(shù)據(jù)路徑,因?yàn)樗梢员凰羞M(jìn)程訪問(wèn)。在 Linux 中,我們可以通過(guò)將變量定義在文件的頭文件中來(lái)定義全局變量。

例如:

“`c

int global_var;

“`

在這個(gè)例子中,我們定義了一個(gè)名為 global_var 的整型變量作為全局變量。在多個(gè)線程之間,可以通過(guò)訪問(wèn)這個(gè)全局變量來(lái)共享數(shù)據(jù)。

全局變量的作用域

在使用全局變量時(shí)需要注意作用域的問(wèn)題。

在程序中,有不同的作用域范圍,從而影響了變量的可見(jiàn)性。在多線程編程中,我們需要將全局變量的作用域限定在各個(gè)線程中,以避免線程之間的競(jìng)爭(zhēng)問(wèn)題。

比如,我們可以在不同的函數(shù)中定義同名的全局變量。這些變量之間是沒(méi)有任何影響的,因?yàn)樗鼈兊淖饔糜蚍秶煌?/p>

例如,我們?cè)?file1.c 中定義了一個(gè)全局變量:

“`c

int num1 = 10;

“`

在另一個(gè)文件 file2.c 中,我們定義了一個(gè)同名的全局變量:

“`c

int num1 = 20;

“`

在這種情況下,num1 可以分別被 file1.c 和 file2.c 中的代碼訪問(wèn),但它們之間沒(méi)有任何關(guān)系。

在多線程編程中,我們可以通過(guò)將全局變量定義為靜態(tài),來(lái)限制其作用域只在一個(gè)線程中。

例如:

“`c

static int global_var;

“`

這個(gè)定義告訴編譯器,全局變量 global_var 只能在當(dāng)前文件的作用域范圍內(nèi)使用。這可以避免在多個(gè)線程之間出現(xiàn)全局變量的競(jìng)爭(zhēng)問(wèn)題。

合理使用全局變量

全局變量雖然方便,但在多線程編程中,使用全局變量也有可能引起競(jìng)爭(zhēng)問(wèn)題。在多個(gè)線程同時(shí)修改一個(gè)全局變量時(shí),有可能導(dǎo)致數(shù)據(jù)錯(cuò)亂或者程序崩潰。

因此,在多線程編程中,我們需要合理地使用全局變量,盡可能避免在不同線程中修改同一個(gè)全局變量。一些常用的方法包括:

1. 在不同線程之間傳遞變量通過(guò)參數(shù)傳遞的方式,而不是使用全局變量。

2. 如果必須使用全局變量,需要使用加鎖技術(shù)來(lái)保護(hù)全局變量的訪問(wèn)。只有在一個(gè)線程獲取到了鎖的情況下,才能修改這個(gè)全局變量。

3. 在編寫(xiě)程序時(shí),應(yīng)當(dāng)盡可能地避免使用全局變量,采用局部變量來(lái)代替。

結(jié)論

在 Linux 多線程編程中,全局變量的問(wèn)題是需要注意的。全局變量可以方便地共享數(shù)據(jù),但同時(shí)也需要注意變量的作用域和安全性。我們需要在編寫(xiě)程序時(shí),根據(jù)實(shí)際情況合理地使用全局變量,盡可能地避免出現(xiàn)競(jìng)爭(zhēng)問(wèn)題。

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

  • 如何使用 linux下多線程中條件變量

如何使用 linux下多線程中條件變量

使用條件變量更大的好處是可以避免忙等。相當(dāng)與多線程中的信號(hào)。

  條件變量是線程中的東西就是等待某一條件的發(fā)生和信號(hào)一樣

  以下是說(shuō)明

  ,條件變量使我們可以睡眠等待某種條件出現(xiàn)。

  條件變量是利用線程間共享的全局變量進(jìn)行同步的一種機(jī)制,主要包括兩個(gè)動(dòng)作:一個(gè)線程等待”條件變量的條件成立”而掛起;另一個(gè)線程使”條件成立”(給出條件成立信號(hào))。為了防止槐凳競(jìng)爭(zhēng),條件變量的使用總是和一個(gè)互斥鎖結(jié)合在一起。

  條件變量類型為pthread_cond_t

  創(chuàng)建和注銷

  條件變量和互斥鎖一樣,都有靜態(tài)動(dòng)態(tài)兩種創(chuàng)建方式,靜態(tài)方式使用PTHREAD_COND_INITIALIZER常量,如下:

  pthread_cond_t

cond=PTHREAD_COND_INITIALIZER

  動(dòng)態(tài)方式調(diào)用pthread_cond_init()函數(shù),API定義如下:

  int

pthread_cond_init(pthread_cond_t

*cond,

pthread_condattr_t

*cond_attr)

  盡管POSIX標(biāo)準(zhǔn)中為條件變量定義了屬性,但在LinuxThreads中沒(méi)有實(shí)現(xiàn),因此cond_attr值通常為NULL,且被忽略。

  注銷一個(gè)條件變量需要調(diào)用pthread_cond_destroy(),只有在沒(méi)有線程在該條件變量上等待的時(shí)候才能注銷這個(gè)條件變量,否則返回EBUSY。API定義如下:

  int

pthread_cond_destroy(pthread_cond_t

*cond)

  等待和激發(fā)

  int

pthread_cond_wait(pthread_cond_t

*cond,

pthread_mutex_t

*mutex)

  int

pthread_cond_timedwait(pthread_cond_t

*cond,

pthread_mutex_t

*mutex,

const

struct

timespec

*abstime)

  等待條件有兩種方式:無(wú)條件等待pthread_cond_wait()和計(jì)時(shí)等待pthread_cond_timedwait(),其中計(jì)時(shí)等待方式如果在給定時(shí)刻前條件沒(méi)有滿足,則返回ETIMEOUT,結(jié)束等待,其中abstime以與time()系統(tǒng)調(diào)用相同意義的絕對(duì)時(shí)間形式出現(xiàn),0表示格林尼治時(shí)間1970年1月1日0時(shí)0分0秒。

  使用絕對(duì)時(shí)間而非相對(duì)時(shí)間的優(yōu)點(diǎn)是吵明。如果函數(shù)提前返回(很可能因?yàn)椴东@了一個(gè)信號(hào),)

  無(wú)論哪種等待方式,都必須和一個(gè)互斥鎖配合,以防止多個(gè)線程同時(shí)請(qǐng)求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的競(jìng)爭(zhēng)條件(Race

Condition)。mutex互斥鎖必須是普通鎖(PTHREAD_MUTEX_TIMED_NP)或者適應(yīng)鎖(PTHREAD_MUTEX_ADAPTIVE_NP),且在調(diào)用pthread_cond_wait()前必須由本線程加鎖(pthread_mutex_lock()),而在更新條件等待隊(duì)列以前,mutex保持鎖定狀態(tài),并在線程掛起進(jìn)入等待前解鎖。在條件滿足從而離開(kāi)pthread_cond_wait()之前,mutex將被重新加鎖,以與進(jìn)入pthread_cond_wait()前的加鎖動(dòng)作對(duì)應(yīng)。

  激發(fā)條件有兩種形式,pthread_cond_signal()激活鉛碰旅一個(gè)等待該條件的線程,存在多個(gè)等待線程時(shí)按入隊(duì)順序激活其中一個(gè);而pthread_cond_broadcast()則激活所有等待線程。

  其他

  pthread_cond_wait()和pthread_cond_timedwait()都被實(shí)現(xiàn)為取消點(diǎn),因此,在該處等待的線程將立即重新運(yùn)行,在重新鎖定mutex后離開(kāi)pthread_cond_wait(),然后執(zhí)行取消動(dòng)作。也就是說(shuō)如果pthread_cond_wait()被取消,mutex是保持鎖定狀態(tài)的,因而需要定義退出回調(diào)函數(shù)來(lái)為其解鎖。

在網(wǎng)上看到這個(gè)系列的

文章對(duì)Linux下的POSIX線程編程方法闡述的十分的清晰,小弟目前關(guān)心要學(xué)習(xí)線程同步中的條件變量的使用方法,轉(zhuǎn)載一下呵呵……

互斥對(duì)象是線程程序必需的工具,但它們并非萬(wàn)能的。例如,如果線程正在侍者等待共享數(shù)據(jù)內(nèi)某個(gè)條件出現(xiàn),那會(huì)發(fā)生什么呢?代碼可以反復(fù)對(duì)互斥對(duì)象鎖定和解鎖, 以檢查值的任何變化。同時(shí),還要快速將互斥對(duì)象解鎖,以便其它線程能夠進(jìn)行任何必需的更改。這是一種非??膳碌姆椒?,因?yàn)榫€程需要在合理的時(shí)間范圍內(nèi)頻繁 地循環(huán)檢測(cè)變化。

在每次檢查之間,可以讓調(diào)用線程短暫地進(jìn)入睡眠,比如睡眠三秒鐘,但是因此線程代碼就無(wú)法最快作出響應(yīng)。真正需要的是這樣一種方法,當(dāng)線程在等待滿足某些 條件時(shí)使線程進(jìn)入睡眠狀態(tài)。一旦條件滿足,還需要一種方法以喚醒因等待滿足特定條件而睡眠的線程。如果能夠做到這一點(diǎn),線程代碼將是非常高效的,并且不會(huì) 占用寶貴的互斥對(duì)象鎖。這正是 POSIX 條件變量能做的事!

本文是 POSIX 線程三部曲系列的最后一部分,Daniel 將詳細(xì)討論如何使用條件變量。條件變量是 POSIX 線程結(jié)構(gòu),可以讓您在遇到某些條件時(shí)“喚醒”線程??梢詫⑺鼈兛醋魇且环N線程安全的信號(hào)發(fā)送。Daniel 使用目前您所學(xué)到的知識(shí)實(shí)現(xiàn)了一個(gè)多線程工作組應(yīng)用程序,本文將圍繞著這一示例而進(jìn)行討論。

條件變量詳解

在 上一篇文章結(jié) 束時(shí),我描述了一個(gè)比較特殊的難題:如果線程正在等待某個(gè)特定條件發(fā)生,它應(yīng)該如何處理這種情況?它可以重復(fù)對(duì)互斥對(duì)象鎖定和解鎖,每次都會(huì)檢查共享數(shù)據(jù) 結(jié)構(gòu),以查找某個(gè)值。但這是在浪費(fèi)時(shí)間和資源,而且這種繁忙查詢的效率非常低。解決這個(gè)問(wèn)題的更佳方法是使用 pthread_cond_wait() 調(diào)用來(lái)等待特殊條件發(fā)生。

了解 pthread_cond_wait() 的作用非常重要 — 它是 POSIX 線程信號(hào)發(fā)送系統(tǒng)的核心,也是最難以理解的部分。

首先,讓我們考慮以下情況:線程為查看已鏈接列表而鎖定了互斥對(duì)象,然而該列表恰巧是空的。這一特定線程什么也干不了 — 其設(shè)計(jì)意圖是從列表中除去節(jié)點(diǎn),但是現(xiàn)在卻沒(méi)有節(jié)點(diǎn)。因此,它只能:

鎖定互斥對(duì)象時(shí),線程將調(diào)用 pthread_cond_wait(&mycond,&mymutex)。pthread_cond_wait() 調(diào)用相當(dāng)復(fù)雜,因此我們每次只執(zhí)行它的一個(gè)操作。

pthread_cond_wait() 所做的之一件事就是同時(shí)對(duì)互斥對(duì)象解鎖(于是其它線程可以修改已鏈接列表),并等待條件 mycond 發(fā)生(這樣當(dāng) pthread_cond_wait() 接收到另一個(gè)線程的氏襪“信號(hào)”時(shí),它將蘇醒)?,F(xiàn)在互斥對(duì)象已被解鎖,其它線程可以訪問(wèn)和修改已鏈接列表,可能還會(huì)添加項(xiàng)。

此 時(shí),pthread_cond_wait() 調(diào)用還未返回。對(duì)互斥對(duì)象解鎖會(huì)立即發(fā)生,但等待條件 mycond 通常是一個(gè)阻塞操作,這意味著線程將睡眠,在它蘇醒之前不會(huì)消耗 CPU 周期。這正是我們期待發(fā)生的情況。線程將一直睡眠,直到特定條件發(fā)生,在這期間不會(huì)發(fā)生任何浪費(fèi) CPU 時(shí)間的繁忙查詢。從線程的角度來(lái)看,它只是在等待 pthread_cond_wait() 調(diào)用返回。

現(xiàn)在繼續(xù)說(shuō)明,假設(shè) 另一個(gè)線程(稱作“2 號(hào)線程”)鎖定了 mymutex 并對(duì)已鏈接列表添加了一項(xiàng)。在對(duì)互斥對(duì)象解鎖之后,2 號(hào)線程會(huì)立即調(diào)用函數(shù) pthread_cond_broadcast(&mycond)。此操作之后,2 號(hào)線程將使所有等待 mycond 條件變量的線程立即蘇醒。這意味著之一個(gè)線程(仍處于 pthread_cond_wait() 調(diào)用中)現(xiàn)在將蘇醒。

現(xiàn) 在,看一下之一個(gè)線程發(fā)生了什么。您可能會(huì)認(rèn)為在 2 號(hào)線殲談激程調(diào)用 pthread_cond_broadcast(&mymutex) 之后,1 號(hào)線程的 pthread_cond_wait() 會(huì)立即返回。不是那樣!實(shí)際上,pthread_cond_wait() 將執(zhí)行最后一個(gè)操作:重新鎖定 mymutex。一旦 pthread_cond_wait() 鎖定了互斥對(duì)象,那么它將返回并允許 1 號(hào)線程繼續(xù)執(zhí)行。那時(shí),它可以馬上檢查列表,查看它所感興趣的更改。

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

成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。


當(dāng)前標(biāo)題:深入理解Linux多線程編程中的全局變量問(wèn)題(linux多線程全局變量)
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/copghpj.html