資料介紹
Windows CE 進程、線程和內存管理(二)
2006-12-09 17:50:44 來源:嵌入式資訊網
分享到: 二、同步
在多數情況下,線程之間難免要相互通信、相互協調才能完成任務。比如,當有多個線程共同訪問同一個資源時,就必須保證一個線程正讀取這個資源數據的時候,其它線程不能夠修改它。這就需要線程之間相互通信,了解對方的行為。再有當一個線程要準備執行下一個任務之前,它必須等待另一個線程終止才能運行,這也需要彼此相互通信。實際開發過程中,線程間需要同步的情況非常多。Windows CE.NET給我們提供了很多的同步機制,熟練的掌握這些機制并合理運用會使線程之間的同步更合理、更高效。進程間的通信機制在下一篇文章中講解。
Windows CE.NET具有兩種運行模式:用戶模式和內核模式。并且允許一個運行于用戶模式的應用程序隨時切換為內核模式,或切換回來。線程同步的有些解決辦法運行在用戶模式,有些運行在內核模式。《Windows核心編程》上說從用戶模式切換到內核模式再切換回來至少要1000個CPU周期。我查看過CE下API函數SetKMode的源碼,這個函數用于在兩種模式間切換,改變模式只需修改一些標志,至于需要多少個CPU周期很難確定。但至少可以肯定來回切換是需要一定時間的。所以在選擇同步機制上應該優先考慮運行在用戶模式的同步解決辦法。
1、互鎖函數
互鎖函數運行在用戶模式。它能保證當一個線程訪問一個變量時,其它線程無法訪問此變量,以確保變量值的唯一性。這種訪問方式被稱為原子訪問。互鎖函數及其功能見如下列表:
函數參數和功能
InterlockedIncrement參數為PLONG類型。此函數使一個LONG變量增1
InterlockedDecrement參數為PLONG類型。此函數使一個LONG變量減1
InterlockedExchangeAdd參數1為PLONG類型,參數2為LONG類型。此函數將參數2賦給參數1指向的值
InterlockedExchange參數1為PLONG類型,參數2為LONG類型。此函數將參數2的值賦給參數1指向的值
InterlockedExchangePointer參數為PVOID* 類型,參數2為PVOID類型。此函數功能同上。具體參見幫助
InterlockedCompareExchange參數1為PLONG類型,參數2為LONG類型,參數3為LONG類型。此函數將參數1指向的值與參數3比較,相同則把參數2的值賦給參數1指向的值。不相同則不變
InterlockedCompareExchangePointer參數1為PVOID* 類型,參數2為PVOID類型,參數3為PVOID。此函數功能同上。具體參見幫助
2、臨界區
臨界區對象運行在用戶模式。它能保證在臨界區內所有被訪問的資源不被其它線程訪問,直到當前線程執行完臨界區代碼。除了API外,MFC也對臨界區函數進行了封裝。臨界區相關函數:
void InitializeCriticalSection ( LPCRITICAL_SECTION );
void EnterCriticalSection ( LPCRITICAL_SECTION );
void LeaveCriticalSection ( LPCRITICAL_SECTION );
void DeleteCriticalSection ( LPCRITICAL_SECTION );
舉例如下:
void CriticalSectionExample (void)
{
CRITICAL_SECTION csMyCriticalSection;
InitializeCriticalSection (&csMyCriticalSection); ///初始化臨界區變量
__try
{
EnterCriticalSection (&csMyCriticalSection); ///開始保護機制
///此處編寫代碼
}
__finally ///異常處理,無論是否異常都執行此段代碼
{
LeaveCriticalSection (&csMyCriticalSection); ///撤銷保護機制
}
}
MFC類使用更簡單:
CCriticalSection cs;
cs.Lock();
///編寫代碼
cs.Unlock();
使用臨界區要注意的是避免死鎖。當有兩個線程,每個線程都有臨界區,而且臨界區保護的資源有相同的時候,這時就要在編寫代碼時多加考慮。
3、事件對象
事件對象運行在內核模式。與用戶模式不同,內核模式下線程利用等待函數來等待所需要的事件、信號,這個等待過程由操作系統內核來完成,而線程處于睡眠狀態,當接收到信號后,內核恢復線程的運行。內核模式的優點是線程在等待過程中并不浪費CPU時間,缺點是從用戶模式切換到內核模式需要一定的時間,而且還要切換回來。在講解事件對象前應該先談談等待函數。等待函數有四個。具體參數和功能見下表:
函數參數和功能
WaitForSingleObject參數1為HANDLE類型,參數2為DWORD類型。此函數等待參數1標識的事件,等待時間為參數2的值,單位ms。如果不超時,當事件成為有信號狀態時,線程喚醒繼續運行。
WaitForMultipleObjects參數1為DWORD類型,參數2為HANDLE * 類型,參數3為BOOL類型,參數4為DWORD類型。此函數等待參數2指向的數組中包含的所有事件。如果不超時,當參數3為FALSE時,只要有一個事件處于有信號狀態,函數就返回這個事件的索引。參數3為TRUE時,等待所有事件都處于有信號狀態時才返回。
MsgWaitForMultipleObjects參數1為DWORD類型,參數2為LPHANDLE類型,參數3為BOOL類型,參數4為DWORD類型,參數5為DWORD類型。此函數功能上同WaitForMultipleObjects函數相似,只是多了一個喚醒掩碼。喚醒掩碼都是和消息有關的。此函數不但能夠為事件等待,還能為特定的消息等待。其實這個函數就是專為等待消息而定義的。
MsgWaitForMultipleObjectsEx參數1為DWORD類型,參數2為LPHANDLE類型,參數3為DWORD類型,參數4為DWORD類型,參數5為DWORD類型。此函數是MsgWaitForMultipleObjects函數的擴展。將原來函數的參數3除掉,添加參數5為標志。標志有兩個值:0或MWMO_INPUTAVAILABLE。
如果一個線程既要執行大量任務同時又要響應用戶的按鍵消息,這兩個專用于等待消息的函數將非常有用。
和事件有關的函數有:
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPTSTR lpName);
BOOL SetEvent(HANDLE hEvent );
BOOL PulseEvent(HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);
HANDLE OpenEvent(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName );
事件對象是最常用的內核模式同步方法。它包含一個使用計數和兩個BOOL變量。其中一個BOOL變量指定這個事件對象是自動重置還是手工重置。另一個BOOL變量指定當前事件對象處于有信號狀態還是無信號狀態。
函數CreateEvent創建一個事件對象,參數1必須為NULL,參數2指定是否手工重新設置事件對象的狀態。如果為FALSE,當等待函數接到信號并返回后此事件對象被自動置為無信號狀態。這時等待此事件對象的其它線程就不會被喚醒,因為事件對象已經被置為無信號狀態。如果參數2設置為TRUE,當等待函數接到信號并返回后事件對象不會被自動置于無信號狀態,其它等待此事件對象的線程都能夠被喚醒。用ResetEvent函數可以手工將事件對象置為無信號狀態。相反SetEvent函數將事件對象置為有信號狀態。PulseEvent函數將事件對象置為有信號狀態,然后立即置為無信號狀態,在實際開發中這個函數很少使用。OpenEvent函數打開已經創建的事件對象,一般用于不同進程內的線程同步。在調用CreateEvent創建一個事件對象時,傳遞一個名字給參數4,這樣在其它進程中的線程就可以調用OpenEvent函數并指定事件對象的名字,來訪問這個事件對象。
2006-12-09 17:50:44 來源:嵌入式資訊網
分享到: 二、同步
在多數情況下,線程之間難免要相互通信、相互協調才能完成任務。比如,當有多個線程共同訪問同一個資源時,就必須保證一個線程正讀取這個資源數據的時候,其它線程不能夠修改它。這就需要線程之間相互通信,了解對方的行為。再有當一個線程要準備執行下一個任務之前,它必須等待另一個線程終止才能運行,這也需要彼此相互通信。實際開發過程中,線程間需要同步的情況非常多。Windows CE.NET給我們提供了很多的同步機制,熟練的掌握這些機制并合理運用會使線程之間的同步更合理、更高效。進程間的通信機制在下一篇文章中講解。
Windows CE.NET具有兩種運行模式:用戶模式和內核模式。并且允許一個運行于用戶模式的應用程序隨時切換為內核模式,或切換回來。線程同步的有些解決辦法運行在用戶模式,有些運行在內核模式。《Windows核心編程》上說從用戶模式切換到內核模式再切換回來至少要1000個CPU周期。我查看過CE下API函數SetKMode的源碼,這個函數用于在兩種模式間切換,改變模式只需修改一些標志,至于需要多少個CPU周期很難確定。但至少可以肯定來回切換是需要一定時間的。所以在選擇同步機制上應該優先考慮運行在用戶模式的同步解決辦法。
1、互鎖函數
互鎖函數運行在用戶模式。它能保證當一個線程訪問一個變量時,其它線程無法訪問此變量,以確保變量值的唯一性。這種訪問方式被稱為原子訪問。互鎖函數及其功能見如下列表:
函數參數和功能
InterlockedIncrement參數為PLONG類型。此函數使一個LONG變量增1
InterlockedDecrement參數為PLONG類型。此函數使一個LONG變量減1
InterlockedExchangeAdd參數1為PLONG類型,參數2為LONG類型。此函數將參數2賦給參數1指向的值
InterlockedExchange參數1為PLONG類型,參數2為LONG類型。此函數將參數2的值賦給參數1指向的值
InterlockedExchangePointer參數為PVOID* 類型,參數2為PVOID類型。此函數功能同上。具體參見幫助
InterlockedCompareExchange參數1為PLONG類型,參數2為LONG類型,參數3為LONG類型。此函數將參數1指向的值與參數3比較,相同則把參數2的值賦給參數1指向的值。不相同則不變
InterlockedCompareExchangePointer參數1為PVOID* 類型,參數2為PVOID類型,參數3為PVOID。此函數功能同上。具體參見幫助
2、臨界區
臨界區對象運行在用戶模式。它能保證在臨界區內所有被訪問的資源不被其它線程訪問,直到當前線程執行完臨界區代碼。除了API外,MFC也對臨界區函數進行了封裝。臨界區相關函數:
void InitializeCriticalSection ( LPCRITICAL_SECTION );
void EnterCriticalSection ( LPCRITICAL_SECTION );
void LeaveCriticalSection ( LPCRITICAL_SECTION );
void DeleteCriticalSection ( LPCRITICAL_SECTION );
舉例如下:
void CriticalSectionExample (void)
{
CRITICAL_SECTION csMyCriticalSection;
InitializeCriticalSection (&csMyCriticalSection); ///初始化臨界區變量
__try
{
EnterCriticalSection (&csMyCriticalSection); ///開始保護機制
///此處編寫代碼
}
__finally ///異常處理,無論是否異常都執行此段代碼
{
LeaveCriticalSection (&csMyCriticalSection); ///撤銷保護機制
}
}
MFC類使用更簡單:
CCriticalSection cs;
cs.Lock();
///編寫代碼
cs.Unlock();
使用臨界區要注意的是避免死鎖。當有兩個線程,每個線程都有臨界區,而且臨界區保護的資源有相同的時候,這時就要在編寫代碼時多加考慮。
3、事件對象
事件對象運行在內核模式。與用戶模式不同,內核模式下線程利用等待函數來等待所需要的事件、信號,這個等待過程由操作系統內核來完成,而線程處于睡眠狀態,當接收到信號后,內核恢復線程的運行。內核模式的優點是線程在等待過程中并不浪費CPU時間,缺點是從用戶模式切換到內核模式需要一定的時間,而且還要切換回來。在講解事件對象前應該先談談等待函數。等待函數有四個。具體參數和功能見下表:
函數參數和功能
WaitForSingleObject參數1為HANDLE類型,參數2為DWORD類型。此函數等待參數1標識的事件,等待時間為參數2的值,單位ms。如果不超時,當事件成為有信號狀態時,線程喚醒繼續運行。
WaitForMultipleObjects參數1為DWORD類型,參數2為HANDLE * 類型,參數3為BOOL類型,參數4為DWORD類型。此函數等待參數2指向的數組中包含的所有事件。如果不超時,當參數3為FALSE時,只要有一個事件處于有信號狀態,函數就返回這個事件的索引。參數3為TRUE時,等待所有事件都處于有信號狀態時才返回。
MsgWaitForMultipleObjects參數1為DWORD類型,參數2為LPHANDLE類型,參數3為BOOL類型,參數4為DWORD類型,參數5為DWORD類型。此函數功能上同WaitForMultipleObjects函數相似,只是多了一個喚醒掩碼。喚醒掩碼都是和消息有關的。此函數不但能夠為事件等待,還能為特定的消息等待。其實這個函數就是專為等待消息而定義的。
MsgWaitForMultipleObjectsEx參數1為DWORD類型,參數2為LPHANDLE類型,參數3為DWORD類型,參數4為DWORD類型,參數5為DWORD類型。此函數是MsgWaitForMultipleObjects函數的擴展。將原來函數的參數3除掉,添加參數5為標志。標志有兩個值:0或MWMO_INPUTAVAILABLE。
如果一個線程既要執行大量任務同時又要響應用戶的按鍵消息,這兩個專用于等待消息的函數將非常有用。
和事件有關的函數有:
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPTSTR lpName);
BOOL SetEvent(HANDLE hEvent );
BOOL PulseEvent(HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);
HANDLE OpenEvent(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName );
事件對象是最常用的內核模式同步方法。它包含一個使用計數和兩個BOOL變量。其中一個BOOL變量指定這個事件對象是自動重置還是手工重置。另一個BOOL變量指定當前事件對象處于有信號狀態還是無信號狀態。
函數CreateEvent創建一個事件對象,參數1必須為NULL,參數2指定是否手工重新設置事件對象的狀態。如果為FALSE,當等待函數接到信號并返回后此事件對象被自動置為無信號狀態。這時等待此事件對象的其它線程就不會被喚醒,因為事件對象已經被置為無信號狀態。如果參數2設置為TRUE,當等待函數接到信號并返回后事件對象不會被自動置于無信號狀態,其它等待此事件對象的線程都能夠被喚醒。用ResetEvent函數可以手工將事件對象置為無信號狀態。相反SetEvent函數將事件對象置為有信號狀態。PulseEvent函數將事件對象置為有信號狀態,然后立即置為無信號狀態,在實際開發中這個函數很少使用。OpenEvent函數打開已經創建的事件對象,一般用于不同進程內的線程同步。在調用CreateEvent創建一個事件對象時,傳遞一個名字給參數4,這樣在其它進程中的線程就可以調用OpenEvent函數并指定事件對象的名字,來訪問這個事件對象。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- C语言多线程的详细教程资料说明10次下载
- 关于进程与线程的解析PDF文件资料11次下载
- windows应用程序读取进程的内存工具免费下载1次下载
- Windows CE 进程、线程和内存管理三0次下载
- Windows CE 进程、线程和内存管理一0次下载
- Windows CE 电源管理解析0次下载
- 基于Windows 操作系统内核驱动的多核CPU 线程管理0次下载
- 用多线程实现GPS接收机与PDA在Windows CE下的串口通5次下载
- Windows CE详解67次下载
- 基于Windows CE的GPS串行通信的实现18次下载
- 基于Windows CE的数控软件开发与实现56次下载
- 基于Windows CE嵌入式系统的智能小区广告机的设计19次下载
- Windows线程、窗口与消息内在机制研究28次下载
- Windows CE下多线程串口通信28次下载
- WINDOWS核心编程 (pdf下载)1011次下载
- Python中多线程和多进程的区别819次阅读
- 线程是什么的基本单位 进程与线程的本质区别1175次阅读
- 进程和线程的概念及其区别1128次阅读
- RTOS中的线程、进程和协程详解2313次阅读
- 关于Python多进程和多线程详解1055次阅读
- Java多线程的用法1093次阅读
- 程序中进程和线程的区别850次阅读
- 进程(线程)精细化控制中方法的使用729次阅读
- 什么是多线程1643次阅读
- 为什么在JVM中线程崩溃不会导致JVM进程崩溃呢?807次阅读
- 基于Windows NT多线程实现智能蓄电池远程监控系统的设计1974次阅读
- 如何管理Linux 的内存分页?3913次阅读
- 如何避免僵尸进程,多线程的实现原理8488次阅读
- Windows CE.NET 4.2下的串行通信技术讲解1810次阅读
- 一文读懂线程、进程、程序之间的不同1459次阅读
下載排行
本周
- 1GD100PIX120C6SNA規格書
- 0.98 MB | 3次下載 | 免費
- 2一款入耳式耳機的仿真與分析
- 0.44 MB | 2次下載 | 免費
- 3Eurotherm TKS Temperature 用戶手冊
- 1.46 MB | 2次下載 | 免費
- 4人形機器人電機驅動和傳感報告
- 4.27 MB | 2次下載 | 免費
- 5無線系統中天線和RF元件電磁建模
- 7.48 MB | 1次下載 | 4 積分
- 6Multisim模擬電路仿真教程
- 1.93 MB | 1次下載 | 3 積分
- 7DMP300C1型微機變壓器保護測控裝置技術說明書
- 4.11 MB | 次下載 | 10 積分
- 8用MT3540芯片設計BOOST電路 1(可下載)
- 445.66 KB | 次下載 | 免費
本月
- 1晶體三極管的電流放大作用詳細說明
- 0.77 MB | 32次下載 | 2 積分
- 2Python從入門到精通背記手冊
- 18.77 MB | 27次下載 | 1 積分
- 3雙極型三極管放大電路的三種基本組態的學習課件免費下載
- 4.03 MB | 25次下載 | 1 積分
- 4AIWA HS-J303 MKⅡ維修手冊
- 22.47 MB | 23次下載 | 10 積分
- 5多級放大電路的學習課件免費下載
- 1.81 MB | 21次下載 | 2 積分
- 6九陽豆漿機高清原理圖
- 2.47 MB | 20次下載 | 1 積分
- 7AIWA HS-J202/HS-J202M/HS-J800維修手冊
- 13.60 MB | 15次下載 | 10 積分
- 81875功放原理圖
- 0.04 MB | 11次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191382次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183337次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81585次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論