對於多執行緒程式設計,很多人概念不清,寫**的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。
所以學習多執行緒程式設計最重要的不是學習api,而是理解什麼才是多執行緒安全的**
從例子說起
#include
<
windows.h
>
#include
<
process.h
>
long
global1 =0
;volatile
long
global2 =0
;class
myclass
intfun(
intv)
void
set(
intv)
intm;
};myclass global_object;
//-------------8
unsigned
int__stdcall thread_fun1(
void
*param)
unsigned
int__stdcall thread_fun2(
void
*param)
intmain()
1.區域性變數區域性使用是安全的
為什麼?因為每個thread 都有自己的執行堆疊,而區域性變數是生存在堆疊中,大家不干擾。
所以**1
int 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
寫好多執行緒安全的法寶就是封裝,使資料有保護的被訪問到
安全性:
區域性變數》成員變數》全域性變數
**
C C 多執行緒
前幾天簡單對c和c 中的建立多執行緒的函式進行了測試,這篇隨筆就簡單介紹一下建立執行緒的相關函式。c中三個建立執行緒函式 pthread create beginthread createthread 三個關閉執行緒函式 pthread exit endthread exitthread 標頭檔案分...
c c 執行緒 3執行緒池
最近一段時間在看linux下c語言的多執行緒,其中乙個比較重要的應用就是執行緒池。自己也參照著網上的資料寫了乙個簡單的執行緒池。這裡做以總結。我們的應用在任何時候都要準備應對數目巨大的連線請求,同時,這些請求所要完成的任務卻又可能非常的簡單,即只占用很少的處理時間。總之執行緒池通常適合下面的幾個場合...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...