多執行緒基礎

2021-07-04 13:16:56 字數 1741 閱讀 8157

對於多執行緒程式設計,很多人概念不清,寫**的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。

所以學習多執行緒程式設計最重要的不是學習

api,

而是理解什麼才是多執行緒安全的**

從例子說起

#include 

#include 

long  global1 = 0;

volatile

long  global2 = 0;

class  myclass

int  fun( int  v)

void

set ( int  v)

int  m;

};myclass global_object;  //-------------8

unsigned  int  __stdcall thread_fun1( void  *param)

unsigned  int  __stdcall thread_fun2( void  *param)

int  main()

1.區域性變數區域性使用是安全的

為什麼?

因為每個

thread 

都有自己的執行堆疊,而區域性變數是生存在堆疊中

,大家不干擾。

所以**

1int local1; 

++local1; 

是安全的

2.全域性原生變數多執行緒讀寫是不安全的

全域性變數是在堆

(heap)

中long global1 = 0; 

++global2; 

++ 這個操作其實分為兩部,乙個是讀,另外乙個是寫

mov         ecx,global 

add         ecx,1 

mov         global,ecx 

所以**

3處是不安全的

3.函式靜態變數多執行緒讀寫也是不安全的

道理同2

所以**

2處也是不安全的

4.volatile

能保證全域性整形變數是多執行緒安全的麼

不能。volatile 

僅僅是告誡

compiler

不要對這個變數作優化,每次都要從

memory

取數值,而不是從

register

所以**

4也不是安全

5.interlockedincrement

保證整型變數自增的原子性

所以**

5是安全的

6.function static object

的初始化是多執行緒安全的麼

不是。著名的

meyer singleton

其實不是執行緒安全的

object & getinstance() 

可能會造成多次初始化物件

所以**

6處是不安全的

7.在32機器上,

4位元組整形一次

assign

是原子的

比如i =10; //thread1 

i=4; //thread2 

不會導致

i的值處於未知狀態

,要麼是

10要麼是4

寫好多執行緒安全的法寶就是封裝,使資料有保護的被訪問到

安全性:

區域性變數

>

成員變數

>

全域性變數

多執行緒基礎

什麼是併發 同時執行多個程式,或者乙個程式的多段 在巨集觀上,存在併發的,但是在微觀上,其實不存在併發 時間片 在計算機中,使用時間片來實現併發的運算 在計算甲中,在最小的單位時間上 只能執行乙個運算 用來控制多個程式之間的輪轉,使得程式交替的執行 達到併發的目的 多個cpu 多個核心 才能實現真正...

多執行緒基礎

多執行緒的最底層依賴於unsafe的compareandswap cas 和locksupport的park和unpark操作。cas需要傳遞兩個引數 expect和update。先跟第乙個引數expect進行比較,如果等於第乙個引數,那麼就將該值設定為第二個引數,這是由硬體提供的原子操作,所以不會...

多執行緒基礎

coding utf 8 import requests import threading import sys from time import sleep reload sys sys.setdefaultencoding utf 8 單執行緒 順序執行 如果第乙個人沒有執行完 第二個不能開始 ...