日韩无码专区无码一级三级片|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)銷解決方案
線程及線程安全

對(duì)于基于Linux操作系統(tǒng)的開(kāi)發(fā)者來(lái)說(shuō),多線程是一個(gè)在開(kāi)發(fā)和面試中不可避免的、被廣泛討論的話題。本文首先對(duì)線程進(jìn)行簡(jiǎn)單的介紹,然后介紹幾種保證線程安全的方法。

專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來(lái)客戶和效益!成都創(chuàng)新互聯(lián)公司為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計(jì)制作,服務(wù)好的網(wǎng)站設(shè)計(jì)公司,網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站負(fù)責(zé)任的成都網(wǎng)站制作公司!

一、線程簡(jiǎn)介

在介紹線程之前,要引入進(jìn)程(Process)的概念。進(jìn)程有狹義和廣義之分,狹義的進(jìn)程是正在運(yùn)行的程序的實(shí)例;廣義的進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng),是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元。

線程(Thread),有時(shí)被稱為輕量級(jí)進(jìn)程(LWP),是程序執(zhí)行流的最小單位;一個(gè)標(biāo)準(zhǔn)的線程由線程ID、當(dāng)前指令指針(PC)、寄存器集合和堆棧組成。通常情況下,一個(gè)進(jìn)程由一個(gè)到多個(gè)線程組成,各個(gè)線程之間共享程序的內(nèi)存空間及一些進(jìn)程級(jí)的資源。

在大多數(shù)軟件應(yīng)用中,線程的數(shù)量都不止一個(gè),多線程程序處在一個(gè)多變的環(huán)境中,可訪問(wèn)的全局變量和堆數(shù)據(jù)隨時(shí)都可能被其他的線程改變,這就將“線程安全”的問(wèn)題提上了議程。那么,如何確保線程的安全呢?

二、線程安全

一般說(shuō)來(lái),確保線程安全的方法有這幾個(gè):競(jìng)爭(zhēng)與原子操作、同步與鎖、可重入、過(guò)度優(yōu)化。

1. 競(jìng)爭(zhēng)與原子操作

多個(gè)線程同時(shí)訪問(wèn)和修改一個(gè)數(shù)據(jù),可能造成很嚴(yán)重的后果。出現(xiàn)嚴(yán)重后果的原因是很多操作被操作系統(tǒng)編譯為匯編代碼之后不止一條指令,因此在執(zhí)行的時(shí)候可能執(zhí)行了一半就被調(diào)度系統(tǒng)打斷了而去執(zhí)行別的代碼了。一般將單指令的操作稱為原子的(Atomic),因?yàn)椴还茉鯓?,單條指令的執(zhí)行是不會(huì)被打斷的。

因此,為了避免出現(xiàn)多線程操作數(shù)據(jù)的出現(xiàn)異常,Linux系統(tǒng)提供了一些常用操作的原子指令,確保了線程的安全。但是,它們只適用于比較簡(jiǎn)單的場(chǎng)合,在復(fù)雜的情況下就要選用其他的方法了。

2. 同步與鎖

為了避免多個(gè)線程同時(shí)讀寫一個(gè)數(shù)據(jù)而產(chǎn)生不可預(yù)料的后果,開(kāi)發(fā)人員要將各個(gè)線程對(duì)同一個(gè)數(shù)據(jù)的訪問(wèn)同步,也就是說(shuō),在一個(gè)線程訪問(wèn)數(shù)據(jù)未結(jié)束的時(shí)候,其他線程不得對(duì)同一個(gè)數(shù)據(jù)進(jìn)行訪問(wèn)。

同步的最常用的方法是使用鎖(Lock),它是一種非強(qiáng)制機(jī)制,每個(gè)線程在訪問(wèn)數(shù)據(jù)或資源之前首先試圖獲取鎖,并在訪問(wèn)結(jié)束之后釋放鎖;在鎖已經(jīng)被占用的時(shí)候試圖獲取鎖時(shí),線程會(huì)等待,直到鎖重新可用。

二元信號(hào)量是最簡(jiǎn)單的一種鎖,它只有兩種狀態(tài):占用與非占用,它適合只能被***一個(gè)線程獨(dú)占訪問(wèn)的資源。對(duì)于允許多個(gè)線程并發(fā)訪問(wèn)的資源,要使用多元信號(hào)量(簡(jiǎn)稱信號(hào)量)。

3. 可重入

一個(gè)函數(shù)被重入,表示這個(gè)函數(shù)沒(méi)有執(zhí)行完成,但由于外部因素或內(nèi)部因素,又一次進(jìn)入該函數(shù)執(zhí)行。一個(gè)函數(shù)稱為可重入的,表明該函數(shù)被重入之后不會(huì)產(chǎn)生任何不良后果。可重入是并發(fā)安全的強(qiáng)力保障,一個(gè)可重入的函數(shù)可以在多線程環(huán)境下放心使用。

4. 過(guò)度優(yōu)化

在很多情況下,即使我們合理地使用了鎖,也不一定能夠保證線程安全,因此,我們可能對(duì)代碼進(jìn)行過(guò)度的優(yōu)化以確保線程安全。

我們可以使用volatile關(guān)鍵字試圖阻止過(guò)度優(yōu)化,它可以做兩件事:***,阻止編譯器為了提高速度將一個(gè)變量緩存到寄存器而不寫回;第二,阻止編譯器調(diào)整操作volatile變量的指令順序。

在另一種情況下,CPU的亂序執(zhí)行讓多線程安全保障的努力變得很困難,通常的解決辦法是調(diào)用CPU提供的一條常被稱作barrier的指令,它會(huì)阻止CPU將該指令之前的指令交換到barrier之后,反之亦然。

【本文是專欄作者“周兆熊”的原創(chuàng)文章,作者微信公眾號(hào):周氏邏輯(logiczhou)】

戳這里,看該作者更多好文


分享題目:線程及線程安全
文章源于:http://www.5511xx.com/article/djdpesd.html