成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程及線程安全

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

對于基于Linux操作系統的開發者來說,多線程是一個在開發和面試中不可避免的、被廣泛討論的話題。本文首先對線程進行簡單的介紹,然后介紹幾種保證線程安全的方法。

線程安全

一、線程簡介

在介紹線程之前,要引入進程(Process)的概念。進程有狹義和廣義之分,狹義的進程是正在運行的程序的實例;廣義的進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動,是操作系統動態執行的基本單元。

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

在大多數軟件應用中,線程的數量都不止一個,多線程程序處在一個多變的環境中,可訪問的全局變量和堆數據隨時都可能被其他的線程改變,這就將“線程安全”的問題提上了議程。那么,如何確保線程的安全呢?

二、線程安全

一般說來,確保線程安全的方法有這幾個:競爭與原子操作、同步與鎖、可重入、過度優化。

1. 競爭與原子操作

多個線程同時訪問和修改一個數據,可能造成很嚴重的后果。出現嚴重后果的原因是很多操作被操作系統編譯為匯編代碼之后不止一條指令,因此在執行的時候可能執行了一半就被調度系統打斷了而去執行別的代碼了。一般將單指令的操作稱為原子的(Atomic),因為不管怎樣,單條指令的執行是不會被打斷的。

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

2. 同步與鎖

為了避免多個線程同時讀寫一個數據而產生不可預料的后果,開發人員要將各個線程對同一個數據的訪問同步,也就是說,在一個線程訪問數據未結束的時候,其他線程不得對同一個數據進行訪問。

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

二元信號量是最簡單的一種鎖,它只有兩種狀態:占用與非占用,它適合只能被***一個線程獨占訪問的資源。對于允許多個線程并發訪問的資源,要使用多元信號量(簡稱信號量)。

3. 可重入

一個函數被重入,表示這個函數沒有執行完成,但由于外部因素或內部因素,又一次進入該函數執行。一個函數稱為可重入的,表明該函數被重入之后不會產生任何不良后果。可重入是并發安全的強力保障,一個可重入的函數可以在多線程環境下放心使用。

4. 過度優化

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

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

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

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

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2012-04-16 10:12:54

Java線程

2024-05-20 13:13:01

線程安全Java

2009-07-03 18:13:28

Servlet線程安全

2024-06-17 00:02:00

線程安全HashMapJDK 1.7

2021-04-29 20:10:17

安全線程存儲

2025-02-19 00:05:18

Java并發編程

2023-01-26 02:07:51

HashSet線程安全

2018-09-10 11:16:55

線程安全Java

2011-06-22 16:02:37

Qt 多線程 重入

2024-06-04 08:32:40

2019-01-28 08:50:09

線程安全

2023-03-21 09:07:38

HashMap線程安全

2019-10-29 19:49:48

Java線程安全

2012-05-15 02:18:31

Java線程池

2022-10-12 14:23:30

Java線程

2023-11-06 18:37:23

虛擬線程編寫

2011-06-22 14:38:09

QT 多線程 線程安全

2020-04-22 20:35:02

HashMap線程安全

2021-03-05 13:46:56

網絡安全遠程線程

2019-12-20 15:19:41

Synchroinze線程安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品视频久久 | 久久久久久99 | 一区二区精品在线 | 国产精品明星裸体写真集 | 欧美日韩亚洲视频 | 亚洲逼院 | 91精品国产乱码久久久久久久久 | av在线一区二区三区 | 国产在线精品一区二区 | 久久久男人的天堂 | 亚洲国产精品一区二区三区 | 日韩久久网 | 大香网伊人| 国产乱码精品一区二区三区av | 99久久婷婷国产综合精品电影 | japan21xxxxhd美女 日本欧美国产在线 | 中文精品视频 | av大片| 中文字幕亚洲无线 | 欧美精品一区二区三 | 久久精品国产一区 | 国产精品日韩在线观看一区二区 | 一区二区久久精品 | 久久久精品天堂 | 亚洲人成人网 | 国产中文原创 | 国产91精品网站 | 精品亚洲一区二区三区四区五区 | 91视频在线看 | 国产午夜精品福利 | 欧美一区二区三区在线观看 | 国产一区二区三区欧美 | 亚洲欧美在线一区 | 日韩欧美一区二区三区在线播放 | 欧美男人天堂 | 日韩欧美在线观看视频 | 91精品国产高清一区二区三区 | 国产成人精品一区二区 | jizz在线免费观看 | 视频一区二区国产 | 国产视频精品视频 |