執行緒安全C C

2021-06-16 09:20:16 字數 1588 閱讀 3145

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

所以學習多執行緒程式設計最重要的不是學習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語言的多執行緒,其中乙個比較重要的應用就是執行緒池。自己也參照著網上的資料寫了乙個簡單的執行緒池。這裡做以總結。我們的應用在任何時候都要準備應對數目巨大的連線請求,同時,這些請求所要完成的任務卻又可能非常的簡單,即只占用很少的處理時間。總之執行緒池通常適合下面的幾個場合...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...