自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

線程及線程安全

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

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

線程安全

一、線程簡(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)境中,可訪問的全局變量和堆數(shù)據(jù)隨時(shí)都可能被其他的線程改變,這就將“線程安全”的問題提上了議程。那么,如何確保線程的安全呢?

二、線程安全

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

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

多個(gè)線程同時(shí)訪問和修改一個(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ù)料的后果,開發(fā)人員要將各個(gè)線程對(duì)同一個(gè)數(shù)據(jù)的訪問同步,也就是說,在一個(gè)線程訪問數(shù)據(jù)未結(jié)束的時(shí)候,其他線程不得對(duì)同一個(gè)數(shù)據(jù)進(jìn)行訪問。

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

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

3. 可重入

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

4. 過度優(yōu)化

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

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

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

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

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

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2012-04-16 10:12:54

Java線程

2024-05-20 13:13:01

線程安全Java

2021-04-29 20:10:17

安全線程存儲(chǔ)

2025-02-19 00:05:18

Java并發(fā)編程

2023-01-26 02:07:51

HashSet線程安全

2018-09-10 11:16:55

線程安全Java

2009-07-03 18:13:28

Servlet線程安全

2024-06-17 00:02:00

線程安全HashMapJDK 1.7

2011-06-22 16:02:37

Qt 多線程 重入

2012-05-15 02:18:31

Java線程池

2022-10-12 14:23:30

Java線程

2023-11-06 18:37:23

虛擬線程編寫

2024-06-04 08:32:40

2023-03-21 09:07:38

HashMap線程安全

2019-01-28 08:50:09

線程安全

2019-10-29 19:49:48

Java線程安全

2011-06-22 14:38:09

QT 多線程 線程安全

2020-03-05 15:34:16

線程池C語言局域網(wǎng)

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠(yuǎn)程線程

2020-04-22 20:35:02

HashMap線程安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)