麥當勞有兩個做漢堡的廚師(工號:11,12)和三個銷售人員(工號:21,22,23)。
廚師生產漢堡,並負責將做好的漢堡放入貨架,貨架臺大小有限,最多放6個漢堡,11和12不能同時往貨架台上放漢堡,11具有優先權。
銷售人員負責銷售食品,三個銷售人員取食品時,貨架不能為空,三人不能同時取,23優先權最高,21最低。21賣的最快,取得頻率最高,22次之。
一天的工作量是銷售70個漢堡。
這裡先來了解一些概念:
阻塞:函式返回結果之前,執行緒被掛起
非阻塞:函式執行完立即返回,不會阻塞執行緒
同步:函式沒有執行完不返回,執行緒被掛起;
非同步:函式立即返回,結果通過事件或是訊號通知呼叫者;
同步訊息處理就好比linux中簡單的read/write操作,它們需要等待這操作成功才能返回;而非同步處理機制就是類似於select/poll之類的多路復用io操作,當所關注的訊息被觸發時,由訊息觸發機制通知觸發對訊息的處理.
程序:當乙個程式執行時,它就是乙個程序,程序包括執行中的程式所使用到的記憶體和系統資源,同時乙個程序可以包括多個執行緒
執行緒:執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器(棧指標、程式計數器等),但**區是共享的,即不同的執行緒可以執行同樣的函式。
多執行緒:多執行緒是指程式中包含多個執行流,即在乙個程式中可以同時執行多個不同的執行緒來執行不同的任務,也就是說允許單個程式建立多個並行執行的執行緒來完成各自的任務。時間片有cpu分配執行!
thread主要方法:strart(),sleep(int),abort(),suspend(),resume()
執行緒優先順序:在c#應用程式中,使用者可以設定5個不同的優先順序,由高到低分別是highest,abovenormal,normal,belownormal,lowest,在建立執行緒時如果不指定優先順序,那麼系統預設為threadpriority.normal。
執行緒同步(framework中已經為我們提供了三個加鎖的機制,分別是monitor類、lock關鍵字和mutex類。
① c#提供了乙個關鍵字lock,它可以把一段**定義為互斥段(critical section),互斥段在乙個時刻內只允許乙個執行緒進入執行,而其他執行緒必須等待。
在c#中,關鍵字lock定義如下:
lock(expression表示式) statement_block
② monitor主要用法
monitor.enter(obj);
(expression)
monitor.exit(obj);
③ mutex用法
mutex mutex = new mutex();
mutex.waitone();
(expression)
mutex.releasemutex();
舉個lock互斥例子(包括多執行緒使用和多執行緒優先權、同步使用):
using system;
using system.collections.generic;
using system.text;
using system.threading;
namespace testthread
public static void puthb()
廚師開始製作漢堡,,,", strid);
while (true)
,最多放6個漢堡,請讓銷售員取再放!", strid);
thread.sleep(1000);
} else
,在貨架放共放漢堡!", strid, count11);
} else if (strid == "12")
,在貨架放共放漢堡!", strid, count12);
} break;
} lock (lockobject)
if (strid == "11")
,在貨架放已放漢堡! 現在貨架有漢堡!", strid,count11, iputhbnum);
} else if (strid == "12")
,在貨架放已放漢堡! 現在貨架有漢堡!", strid, count12, iputhbnum);
} }
} }
public static void gethb()
銷售員取漢堡,,,", strid);
while (true)
貨架臺已0個漢堡,請等待廚師製作!", strid);
}else
if (strid == "23")
!",count23);
thread.sleep(3000);
}else if (swww.cppcns.comtrid == "22")
!", count22);
thread.sleep(2000);
} else if (strid == "21")
!", count21);
thread.sleep(1000);
} }
if (igethbnum >= 70)
", count23);
} else if (strid == "22")
", count22);
} else if (strid == "21")
", count21);
} break;
} }
} }
}執行結果如下圖所示:
lock可以用monitor,mutex替代:
monitor.enter(lockobject);
iputhbnum++;
monitor.exit(lockobject);
或者:mutex1.waitone();
iputhbnum++;
mutex1.releasemutex();
本文標題: c#簡單多執行緒同步和優先權用法例項
本文位址: /ruanjian/csharp/113559.html
C 簡單多執行緒使用(同步和優先權)
題目 麥當勞有兩個做漢堡的廚師 工號 11,12 和三個銷售人員 工號 21,22,23 廚師生產漢堡,並負責將做好的漢堡放入貨架,貨架臺大小有限,最多放6個漢堡,11和12不能同時往貨架台上放漢堡,11具有優先權。銷售人員負責銷售食品,三個銷售人員取食品時,貨架不能為空,三人不能同時取,23優先權...
易語言多執行緒封裝執行緒啟動優先權設定
1 setthreadpriority 2 resumethread 模組原始碼 子程式 執行緒 啟動 優先權,整數型,公開,返回執行緒控制代碼,必須用 執行緒 關閉 控制代碼 關閉這個控制代碼 引數 要啟動的子程式,子程式指標,要啟動的子程式 引數 要傳去子程式的引數,整數型,可空,往子程式傳遞乙...
Win32多執行緒 程序優先權與執行緒優先順序
1.優先權類別 priority class 優先權類別 是程序的屬性之一。這個屬性可以表現出這一程序和其他程序比較之下的重要性。win32 提供四種優先權類別,每乙個類別對應乙個基本的優先權層級。下表展示了四個優先權類別。優先權類別 priority classes 基礎優先權值 base pri...