C 多執行緒程式設計第二步 執行緒同步與執行緒安全

2022-07-04 04:09:13 字數 2497 閱讀 7560

下面先看乙個例子 :

class

program

num++;

console.writeline(

"num is:

" +num);

console.writeline(

"main thread id is:

" +thread.currentthread.managedthreadid.tostring());

//停止計時

stopwatch.stop();

//輸出執行的時間,毫秒數

console.writeline("

the execution time is

" + stopwatch.elapsedmilliseconds + "

milliseconds.");

console.readkey();

}public

static

void

run()

}

執行結果:

從上面可以看出變數 num 的值不是連續遞增的,輸出也是沒有順序的,而且每次輸出的值都是不一樣的,這是因為非同步執行緒同時訪問乙個成員時造成的,所以這樣的多執行緒對於我們來說是不可控的。以上這個例子就是非執行緒安全的,那麼要做到執行緒安全就需要用到執行緒同步。執行緒同步有很多種方法,比如之前用到過的 join() 方法,它也可以實現執行緒的同步。下面我們來試試:

class

program

num++;

console.writeline(

"num is:

" +num);

console.writeline(

"main thread id is:

" +thread.currentthread.managedthreadid.tostring());

//停止計時

stopwatch.stop();

//輸出執行的時間,毫秒數

console.writeline("

the execution time is

" + stopwatch.elapsedmilliseconds + "

milliseconds.");

console.readkey();

}public

static

void

run()

}

執行結果:

這樣就實現了簡單的同步,相比起上面的**也就只是新增了一行**(thread.join();),之前也提到了 join() 這個方法用於阻止當前執行緒,直到前面的執行緒執行完成。可是這樣雖然是實現了同步,但是卻也阻塞了主線程的繼續執行,這樣和單執行緒貌似沒什麼區別了。既然這樣我們再去學習一下其他的方法。

實現執行緒同步還有一種鎖的機制,下面是一種最簡單的鎖機制,即使用 lock。如下:

class

program

program.num++;

console.writeline(

"num is:

" +program.num);

console.writeline(

"main thread id is:

" +thread.currentthread.managedthreadid.tostring());

//停止計時

stopwatch.stop();

//輸出執行的時間,毫秒數

console.writeline("

the execution time is

" + stopwatch.elapsedmilliseconds + "

milliseconds.");

console.readkey();

}public

void

run()}}

執行結果:

lock 是一種比較好用的簡單的執行緒同步方式,它是通過為給定物件獲取互斥鎖來實現同步的。可以看到這種方式的確沒有阻塞主線程,而且成員變數的值也是連續遞增的,說明是執行緒安全的。lock 鎖機制表示在同一時刻只有乙個執行緒可以鎖定同步物件(在這裡是locker),任何競爭的的其它執行緒都將被阻止,直到這個鎖被釋放。

lock 的引數必須是基於引用型別的物件,不要是基本型別,比如 bool、int,這樣根本不能同步,原因是lock的引數要求是物件,如果傳入 int,勢必要發生裝箱操作,這樣每次lock的都將是乙個新的不同的物件。最好避免使用public型別或不受程式控制的物件例項,因為這樣很可能導致死鎖。永遠也不要 lock 乙個字串。

暫時先到這裡,後面學了其他方法在繼續更新。

第二步 程式語言的學習

xcode的學習和使用非常重要,現在最新穩定版的xcode6是xcode6.4,xcode7按照慣例預計會在今年9月23日的蘋果秋季發布會上,與ios9,swift2.0,ei captain,watch os 2.0還有 的iphone一同發布,xcode6的乙個重要特性是playground,純...

ajax 大洋與小樣的第二步

方法 描述abort 停止當前請求 getallresponseheaders 把 http請求的所有響應首部作為健 值對返回 getresponsehdader header 返回指定首部的串值 open method url 建立對伺服器端呼叫。method引數可以是get post或put。u...

React學習第二步 環境配置與專案搭建

node.js官網 安裝完成開啟cmd命令列,輸入 node v 來檢視版本,若有結果表示安裝成功。由於npm會和node一起安裝,可輸入npm v檢視是否存在。這樣就已經安裝好專案所需環境啦。現在react所需的必要環境已準備完成,下面我們開始使用npm來建立乙個react專案。專案建立完成,大致...