線程需要在下面兩種情況下互相進行通信:
• 當有多個線程訪問共享資源而不使資源被破壞時。
• 當一個線程需要將某個任務已經完成的情況通知另外一個或多個線程時。
解決辦法:
1、原子訪問。
原子訪問,是指線程在訪問資源時能夠確保所有其他線程都不在同一時間內訪問相同的資源。
使用的是互鎖函數::互鎖函數族:Interlocked*函數群(*表示省略后面的字符,即以Interlocked開頭)。
互鎖函數能夠執行下列操作:
1) 打開C P U中的一個特殊的位標志,并注明被訪問的內存地址。
2) 將內存的值讀入一個寄存器。
3) 修改該寄存器。
4) 如果C P U中的特殊位標志是關閉的,則轉入第二步。否則,特殊位標志仍然是打開的,寄存器的值重新存入內存。
2、關鍵代碼段
關鍵代碼段是指一個小代碼段,在代碼能夠執行前,它必須獨占對某些共享資源的訪問權。在線程退出關鍵代碼段之前,系統將不給想要訪問相同資源的其他任何線程進行調度。
指定了一個C R I T I C A L S E C T I O N數據結構g c s,然后在對E n t e r C r i t i c a l S e c t i o n和L e a v e C r i t i c a lS e c t i o n函數調用中封裝了要接觸共享資源。
。

注意:如果有多個不是一道使用的資源,比如線程1和線程2訪問一個資源,而線程1和線程3訪問另一個資源,那么應該為每個資源創建一個獨立的C R I T I C A L S E C T I O N結構。
3、
循環鎖:
指在線程1中如果要對變量進行操作,要先查看這個變量(或資源)有沒有被其它線程用到,如果是,則一直循環(循環次數自定),直到其它線程放棄對該變量(或資源)的控制,如果否,直接可以對該變量(或資源)進行操作。
posted on 2011-10-07 23:58
Yu_ 閱讀(417)
評論(0) 編輯 收藏 引用 所屬分類:
Windows程序設計