對於多執行緒程式設計,很多人概念不清,寫**的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。
所以學習多執行緒程式設計最重要的不是學習
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 單執行緒 順序執行 如果第乙個人沒有執行完 第二個不能開始 ...