執行緒同步即執行緒間對於cpu資源的協調,一次只有乙個執行緒占用資源。進行執行緒同步的方法:
1.執行緒1呼叫方法,執行緒2在執行結束後呼叫resume()方法喚醒工作執行緒,此方法需借助sleep()方法協調時間,不靈活。容易出問題,比如執行緒1還沒有suspend(),執行緒2就resume();或者後台程序還未執行,前台程序就結束了。
2.使用system.threading.monitor的lock語句,調整lock的顆粒度,即可得到想要的執行緒工作順序(兩個執行緒交替輸出、順位輸出)。通過建立乙個物件,實現對上鎖(enter())開鎖(exit())的目的,物件或者是object型別或是type型別。上述方法無法指定執行緒間的工作順序,需要引入訊號的概念來實現,原理類似1中的suspend()和resume()方法。monitor中,有wait()和pulse()方法。原理很簡單,執行緒1用wait()方法等待執行緒2,執行緒2做完工作用pulse()方法知會執行緒1,「我做完了」,執行緒1繼續執行自己的下一步。
3.使用system.threading.waithandle旗下的mutex類可以幫助簡化上鎖的過程,它可以替代為了上鎖而建立的鎖物件。
委託用於呼叫乙個方法,通過委託進行非同步呼叫時,往往是從執行緒池抓取執行緒執行,隨用隨取。運用begininvoke()和endinvoke()的方法實現。以下為乙個示例:兩個執行緒執行,主線程在static void main裡面,執行緒池執行緒執行calculator方法裡的程式。
class program
",thread.currentthread.name);
console.readkey();
}static void getreturn(iasyncresult asyresult)
; data: ", rtn,data);
}public class calculator
thread.sleep(timespan.fromseconds(3));//執行緒池方法持續3s
console.writeline("the current thread is , method complete!",thread.currentthread.name);
int result = x + y;
return result;}}
//int result = del.endinvoke(asyresult)在第26行,緊接著begininvoke,則程式全程消耗7s。
//如果該語句在30行,當主線程工作時間大於執行緒池,執行緒池先工作,反之,主線程先工作,總工作時長為兩者最大值;
}
4. 發布者和訂閱者
發布者的事件c通過委託繫結訂閱者中的方法a,並在其內通過乙個方法b啟用事件c,從而執行方法a。
發布者和訂閱者之間的關係是松耦合的,大多數情況下,它不關心訂閱者執行的結果,除非異常處理時,需要及時止損。
5.observer設計模式
這裡的例子就是熱水壺燒水,在到了快到100度的時候,顯示器提示當前溫度,到了100度是,顯示燒開了。觀察者是顯示器,被觀察者是熱水壺。
推模式:將熱水壺的溫度變數封裝為data(e),通過notify()方法,使得顯示器的值實時更新
拉模式:直接將顯示器向下轉換,作為obj傳遞出去。這時為了訪問溫度,需要為溫度變數建立乙個公共屬性,使得在程式中其它位置也可以修改溫度變數,增加了風險。
推模式就像是通過密碼新傳遞情報,而拉模式就像是**本人出面口頭傳遞,顯然暴露的可能性更大。
這兩種模式都通過notify()方法,傳遞給update()方法,後者從屬於觀察者,一手e,一手obj,這就是事件的**了。
執行緒 委託的非同步呼叫
c programming p323 begininvoke 會立即返回,它將建立乙個另乙個執行緒來完成自己的工作。當我需要它執行後的結果時 例如 pubilc delegate in testdetegate pubilc testdetegate thedetegate thedetegate ...
C 委託的同步呼叫和非同步呼叫
委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。同步呼叫的例子 using system using system.threading public delegate int addhandler int a,int b ...
C 委託的同步呼叫和非同步呼叫
委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。同步呼叫的例子 using system using system.threading public delegate int addhandler int a,int b ...