同步多執行緒處理模式
什麼是程序、執行緒
建立執行緒
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)
interlockedstatic
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,它用的同步鎖是當...