C 筆記16 多執行緒和同步

2021-09-25 21:15:09 字數 3218 閱讀 2794

同步多執行緒處理模式

什麼是程序、執行緒

建立執行緒

var task =

newtask((

)=>})

;// 宣告執行緒之後並不會馬上執行。

task.

start()

;// 執行執行緒

int times =

5000

;var task1 =

newtask((

)=>})

;var task2 =

newtask((

)=>})

;task1.

start()

;task2.

start()

;task1.

wait()

;task2.

wait()

;// 輸出結果為+-無規律地輸出。一般在使用時可以理解為二者同時進行。

var task = task.factory.

startnew((

)=>

"1")

;// startnew()會立刻執行

console.

writeline

(task.result)

;// result會直接阻塞task,保證task執行完成

執行緒異常方法
var task = task.factory.

startnew((

)=>);

// csharp中線程上的異常是被抑制住的,不會向外拋。

task.wait()

task.result

task.waitall()

task.waitany()

var task = task.factory.

startnew((

)=>);

// csharp中線程上的異常是被抑制住的,不會向外拋。

trycatch

(aggregateexception exs)

}

var task = task.factory.

startnew((

)=>);

// csharp中線程上的異常是被抑制住的,不會向外拋。

task.

continuewith

((t)

=>

, taskcountinuationoptions.onlyonfaulted);

// t指前乙個異常的引用,task

// taskcountinuationoptions.onlyonfaulted指在只有在出異常的情況下才執行task.continuewith()。

並行處理

parallel.for()

parallel.foreach()

plinq x.asparallel().x

var list =

newlist

<

int>()

;for

(int i =

0; i<

50000

; i++

)static

void

calctime

(action action)

// 計時器而已

parallel.

each

(list, i =

> i++);

calctime((

)=> list.

foreach

(i =

> i++))

;// 線性方法75ms

calctime((

)=> list.asparallel.

forall

(i =

> i++))

;// 並行方法412ms

calctime((

)=> list.

foreach

(i =

>do(

ref i)))

;// 線性方法290ms

calctime((

)=> list.asparallel.

forall

(i =

>do(

ref i)))

;// 並行方法165ms

calctime((

)=> parallel.

foreach

(list, i =

>do(

ref i)))

;// 並行方法160ms

static

voiddo(

refint i)

原子性
static

int count =0;

static

void

increasement()

}static

void

decreasement()

}static

void

main

(string

args)

lock關鍵字
private

static

readonly

object syn =

newobject()

;static

int count =0;

static

void

increasement()

// 沒有執行完乙個完整的count++,不允許切換執行緒}}

static

void

decreasement()

}}static

void

main

(string

args)

interlocked
static

int count =0;

static

void

increasement()

}static

void

decreasement()

}}static

void

main

(string

args)

多執行緒 16 併發同步

併發 同乙個物件多個執行緒同時操作,比如購買同一車次票。一定涉及到併發就會導致資料不準確問題,比如同一張票被多個人買到了,這稱為執行緒不安全。那怎麼使執行緒安全呢,比如只一台電腦,大家都想用怎麼辦,排隊。跟據演算法誰先用誰後用,保證乙個 人上來用,其他人等著,等這個人用完了下一人用,還是用乙個時間點...

C 多執行緒同步

在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程式繼續執行。在某些情況下可能會出現多個執行緒的同步協同的問題,下面的例子就展示了在兩個執行緒之間如何協同工作。這個程式的思路是共同做一件事情 從乙個arraylist中刪除元素 如果執行完...

多執行緒和同步

分幾種情況 1.其他方法前是否加了synchronized關鍵字,如果沒加,則能。2.如果這個方法內部呼叫了wait,則可以進入其他synchronized方法。3.如果其他個方法都加了synchronized關鍵字,並且內部沒有呼叫wait,則不能。4.如果其他方法是static,它用的同步鎖是當...