資料介紹
Windows CE 進程、線程和內(nèi)存管理(二)
2006-12-09 17:50:44 來源:嵌入式資訊網(wǎng)
分享到: 二、同步
在多數(shù)情況下,線程之間難免要相互通信、相互協(xié)調(diào)才能完成任務。比如,當有多個線程共同訪問同一個資源時,就必須保證一個線程正讀取這個資源數(shù)據(jù)的時候,其它線程不能夠修改它。這就需要線程之間相互通信,了解對方的行為。再有當一個線程要準備執(zhí)行下一個任務之前,它必須等待另一個線程終止才能運行,這也需要彼此相互通信。實際開發(fā)過程中,線程間需要同步的情況非常多。Windows CE.NET給我們提供了很多的同步機制,熟練的掌握這些機制并合理運用會使線程之間的同步更合理、更高效。進程間的通信機制在下一篇文章中講解。
Windows CE.NET具有兩種運行模式:用戶模式和內(nèi)核模式。并且允許一個運行于用戶模式的應用程序隨時切換為內(nèi)核模式,或切換回來。線程同步的有些解決辦法運行在用戶模式,有些運行在內(nèi)核模式?!禬indows核心編程》上說從用戶模式切換到內(nèi)核模式再切換回來至少要1000個CPU周期。我查看過CE下API函數(shù)SetKMode的源碼,這個函數(shù)用于在兩種模式間切換,改變模式只需修改一些標志,至于需要多少個CPU周期很難確定。但至少可以肯定來回切換是需要一定時間的。所以在選擇同步機制上應該優(yōu)先考慮運行在用戶模式的同步解決辦法。
1、互鎖函數(shù)
互鎖函數(shù)運行在用戶模式。它能保證當一個線程訪問一個變量時,其它線程無法訪問此變量,以確保變量值的唯一性。這種訪問方式被稱為原子訪問。互鎖函數(shù)及其功能見如下列表:
函數(shù)參數(shù)和功能
InterlockedIncrement參數(shù)為PLONG類型。此函數(shù)使一個LONG變量增1
InterlockedDecrement參數(shù)為PLONG類型。此函數(shù)使一個LONG變量減1
InterlockedExchangeAdd參數(shù)1為PLONG類型,參數(shù)2為LONG類型。此函數(shù)將參數(shù)2賦給參數(shù)1指向的值
InterlockedExchange參數(shù)1為PLONG類型,參數(shù)2為LONG類型。此函數(shù)將參數(shù)2的值賦給參數(shù)1指向的值
InterlockedExchangePointer參數(shù)為PVOID* 類型,參數(shù)2為PVOID類型。此函數(shù)功能同上。具體參見幫助
InterlockedCompareExchange參數(shù)1為PLONG類型,參數(shù)2為LONG類型,參數(shù)3為LONG類型。此函數(shù)將參數(shù)1指向的值與參數(shù)3比較,相同則把參數(shù)2的值賦給參數(shù)1指向的值。不相同則不變
InterlockedCompareExchangePointer參數(shù)1為PVOID* 類型,參數(shù)2為PVOID類型,參數(shù)3為PVOID。此函數(shù)功能同上。具體參見幫助
2、臨界區(qū)
臨界區(qū)對象運行在用戶模式。它能保證在臨界區(qū)內(nèi)所有被訪問的資源不被其它線程訪問,直到當前線程執(zhí)行完臨界區(qū)代碼。除了API外,MFC也對臨界區(qū)函數(shù)進行了封裝。臨界區(qū)相關函數(shù):
void InitializeCriticalSection ( LPCRITICAL_SECTION );
void EnterCriticalSection ( LPCRITICAL_SECTION );
void LeaveCriticalSection ( LPCRITICAL_SECTION );
void DeleteCriticalSection ( LPCRITICAL_SECTION );
舉例如下:
void CriticalSectionExample (void)
{
CRITICAL_SECTION csMyCriticalSection;
InitializeCriticalSection (&csMyCriticalSection); ///初始化臨界區(qū)變量
__try
{
EnterCriticalSection (&csMyCriticalSection); ///開始保護機制
///此處編寫代碼
}
__finally ///異常處理,無論是否異常都執(zhí)行此段代碼
{
LeaveCriticalSection (&csMyCriticalSection); ///撤銷保護機制
}
}
MFC類使用更簡單:
CCriticalSection cs;
cs.Lock();
///編寫代碼
cs.Unlock();
使用臨界區(qū)要注意的是避免死鎖。當有兩個線程,每個線程都有臨界區(qū),而且臨界區(qū)保護的資源有相同的時候,這時就要在編寫代碼時多加考慮。
3、事件對象
事件對象運行在內(nèi)核模式。與用戶模式不同,內(nèi)核模式下線程利用等待函數(shù)來等待所需要的事件、信號,這個等待過程由操作系統(tǒng)內(nèi)核來完成,而線程處于睡眠狀態(tài),當接收到信號后,內(nèi)核恢復線程的運行。內(nèi)核模式的優(yōu)點是線程在等待過程中并不浪費CPU時間,缺點是從用戶模式切換到內(nèi)核模式需要一定的時間,而且還要切換回來。在講解事件對象前應該先談談等待函數(shù)。等待函數(shù)有四個。具體參數(shù)和功能見下表:
函數(shù)參數(shù)和功能
WaitForSingleObject參數(shù)1為HANDLE類型,參數(shù)2為DWORD類型。此函數(shù)等待參數(shù)1標識的事件,等待時間為參數(shù)2的值,單位ms。如果不超時,當事件成為有信號狀態(tài)時,線程喚醒繼續(xù)運行。
WaitForMultipleObjects參數(shù)1為DWORD類型,參數(shù)2為HANDLE * 類型,參數(shù)3為BOOL類型,參數(shù)4為DWORD類型。此函數(shù)等待參數(shù)2指向的數(shù)組中包含的所有事件。如果不超時,當參數(shù)3為FALSE時,只要有一個事件處于有信號狀態(tài),函數(shù)就返回這個事件的索引。參數(shù)3為TRUE時,等待所有事件都處于有信號狀態(tài)時才返回。
MsgWaitForMultipleObjects參數(shù)1為DWORD類型,參數(shù)2為LPHANDLE類型,參數(shù)3為BOOL類型,參數(shù)4為DWORD類型,參數(shù)5為DWORD類型。此函數(shù)功能上同WaitForMultipleObjects函數(shù)相似,只是多了一個喚醒掩碼。喚醒掩碼都是和消息有關的。此函數(shù)不但能夠為事件等待,還能為特定的消息等待。其實這個函數(shù)就是專為等待消息而定義的。
MsgWaitForMultipleObjectsEx參數(shù)1為DWORD類型,參數(shù)2為LPHANDLE類型,參數(shù)3為DWORD類型,參數(shù)4為DWORD類型,參數(shù)5為DWORD類型。此函數(shù)是MsgWaitForMultipleObjects函數(shù)的擴展。將原來函數(shù)的參數(shù)3除掉,添加參數(shù)5為標志。標志有兩個值:0或MWMO_INPUTAVAILABLE。
如果一個線程既要執(zhí)行大量任務同時又要響應用戶的按鍵消息,這兩個專用于等待消息的函數(shù)將非常有用。
和事件有關的函數(shù)有:
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 );
事件對象是最常用的內(nèi)核模式同步方法。它包含一個使用計數(shù)和兩個BOOL變量。其中一個BOOL變量指定這個事件對象是自動重置還是手工重置。另一個BOOL變量指定當前事件對象處于有信號狀態(tài)還是無信號狀態(tài)。
函數(shù)CreateEvent創(chuàng)建一個事件對象,參數(shù)1必須為NULL,參數(shù)2指定是否手工重新設置事件對象的狀態(tài)。如果為FALSE,當?shù)却瘮?shù)接到信號并返回后此事件對象被自動置為無信號狀態(tài)。這時等待此事件對象的其它線程就不會被喚醒,因為事件對象已經(jīng)被置為無信號狀態(tài)。如果參數(shù)2設置為TRUE,當?shù)却瘮?shù)接到信號并返回后事件對象不會被自動置于無信號狀態(tài),其它等待此事件對象的線程都能夠被喚醒。用ResetEvent函數(shù)可以手工將事件對象置為無信號狀態(tài)。相反SetEvent函數(shù)將事件對象置為有信號狀態(tài)。PulseEvent函數(shù)將事件對象置為有信號狀態(tài),然后立即置為無信號狀態(tài),在實際開發(fā)中這個函數(shù)很少使用。OpenEvent函數(shù)打開已經(jīng)創(chuàng)建的事件對象,一般用于不同進程內(nèi)的線程同步。在調(diào)用CreateEvent創(chuàng)建一個事件對象時,傳遞一個名字給參數(shù)4,這樣在其它進程中的線程就可以調(diào)用OpenEvent函數(shù)并指定事件對象的名字,來訪問這個事件對象。
2006-12-09 17:50:44 來源:嵌入式資訊網(wǎng)
分享到: 二、同步
在多數(shù)情況下,線程之間難免要相互通信、相互協(xié)調(diào)才能完成任務。比如,當有多個線程共同訪問同一個資源時,就必須保證一個線程正讀取這個資源數(shù)據(jù)的時候,其它線程不能夠修改它。這就需要線程之間相互通信,了解對方的行為。再有當一個線程要準備執(zhí)行下一個任務之前,它必須等待另一個線程終止才能運行,這也需要彼此相互通信。實際開發(fā)過程中,線程間需要同步的情況非常多。Windows CE.NET給我們提供了很多的同步機制,熟練的掌握這些機制并合理運用會使線程之間的同步更合理、更高效。進程間的通信機制在下一篇文章中講解。
Windows CE.NET具有兩種運行模式:用戶模式和內(nèi)核模式。并且允許一個運行于用戶模式的應用程序隨時切換為內(nèi)核模式,或切換回來。線程同步的有些解決辦法運行在用戶模式,有些運行在內(nèi)核模式?!禬indows核心編程》上說從用戶模式切換到內(nèi)核模式再切換回來至少要1000個CPU周期。我查看過CE下API函數(shù)SetKMode的源碼,這個函數(shù)用于在兩種模式間切換,改變模式只需修改一些標志,至于需要多少個CPU周期很難確定。但至少可以肯定來回切換是需要一定時間的。所以在選擇同步機制上應該優(yōu)先考慮運行在用戶模式的同步解決辦法。
1、互鎖函數(shù)
互鎖函數(shù)運行在用戶模式。它能保證當一個線程訪問一個變量時,其它線程無法訪問此變量,以確保變量值的唯一性。這種訪問方式被稱為原子訪問。互鎖函數(shù)及其功能見如下列表:
函數(shù)參數(shù)和功能
InterlockedIncrement參數(shù)為PLONG類型。此函數(shù)使一個LONG變量增1
InterlockedDecrement參數(shù)為PLONG類型。此函數(shù)使一個LONG變量減1
InterlockedExchangeAdd參數(shù)1為PLONG類型,參數(shù)2為LONG類型。此函數(shù)將參數(shù)2賦給參數(shù)1指向的值
InterlockedExchange參數(shù)1為PLONG類型,參數(shù)2為LONG類型。此函數(shù)將參數(shù)2的值賦給參數(shù)1指向的值
InterlockedExchangePointer參數(shù)為PVOID* 類型,參數(shù)2為PVOID類型。此函數(shù)功能同上。具體參見幫助
InterlockedCompareExchange參數(shù)1為PLONG類型,參數(shù)2為LONG類型,參數(shù)3為LONG類型。此函數(shù)將參數(shù)1指向的值與參數(shù)3比較,相同則把參數(shù)2的值賦給參數(shù)1指向的值。不相同則不變
InterlockedCompareExchangePointer參數(shù)1為PVOID* 類型,參數(shù)2為PVOID類型,參數(shù)3為PVOID。此函數(shù)功能同上。具體參見幫助
2、臨界區(qū)
臨界區(qū)對象運行在用戶模式。它能保證在臨界區(qū)內(nèi)所有被訪問的資源不被其它線程訪問,直到當前線程執(zhí)行完臨界區(qū)代碼。除了API外,MFC也對臨界區(qū)函數(shù)進行了封裝。臨界區(qū)相關函數(shù):
void InitializeCriticalSection ( LPCRITICAL_SECTION );
void EnterCriticalSection ( LPCRITICAL_SECTION );
void LeaveCriticalSection ( LPCRITICAL_SECTION );
void DeleteCriticalSection ( LPCRITICAL_SECTION );
舉例如下:
void CriticalSectionExample (void)
{
CRITICAL_SECTION csMyCriticalSection;
InitializeCriticalSection (&csMyCriticalSection); ///初始化臨界區(qū)變量
__try
{
EnterCriticalSection (&csMyCriticalSection); ///開始保護機制
///此處編寫代碼
}
__finally ///異常處理,無論是否異常都執(zhí)行此段代碼
{
LeaveCriticalSection (&csMyCriticalSection); ///撤銷保護機制
}
}
MFC類使用更簡單:
CCriticalSection cs;
cs.Lock();
///編寫代碼
cs.Unlock();
使用臨界區(qū)要注意的是避免死鎖。當有兩個線程,每個線程都有臨界區(qū),而且臨界區(qū)保護的資源有相同的時候,這時就要在編寫代碼時多加考慮。
3、事件對象
事件對象運行在內(nèi)核模式。與用戶模式不同,內(nèi)核模式下線程利用等待函數(shù)來等待所需要的事件、信號,這個等待過程由操作系統(tǒng)內(nèi)核來完成,而線程處于睡眠狀態(tài),當接收到信號后,內(nèi)核恢復線程的運行。內(nèi)核模式的優(yōu)點是線程在等待過程中并不浪費CPU時間,缺點是從用戶模式切換到內(nèi)核模式需要一定的時間,而且還要切換回來。在講解事件對象前應該先談談等待函數(shù)。等待函數(shù)有四個。具體參數(shù)和功能見下表:
函數(shù)參數(shù)和功能
WaitForSingleObject參數(shù)1為HANDLE類型,參數(shù)2為DWORD類型。此函數(shù)等待參數(shù)1標識的事件,等待時間為參數(shù)2的值,單位ms。如果不超時,當事件成為有信號狀態(tài)時,線程喚醒繼續(xù)運行。
WaitForMultipleObjects參數(shù)1為DWORD類型,參數(shù)2為HANDLE * 類型,參數(shù)3為BOOL類型,參數(shù)4為DWORD類型。此函數(shù)等待參數(shù)2指向的數(shù)組中包含的所有事件。如果不超時,當參數(shù)3為FALSE時,只要有一個事件處于有信號狀態(tài),函數(shù)就返回這個事件的索引。參數(shù)3為TRUE時,等待所有事件都處于有信號狀態(tài)時才返回。
MsgWaitForMultipleObjects參數(shù)1為DWORD類型,參數(shù)2為LPHANDLE類型,參數(shù)3為BOOL類型,參數(shù)4為DWORD類型,參數(shù)5為DWORD類型。此函數(shù)功能上同WaitForMultipleObjects函數(shù)相似,只是多了一個喚醒掩碼。喚醒掩碼都是和消息有關的。此函數(shù)不但能夠為事件等待,還能為特定的消息等待。其實這個函數(shù)就是專為等待消息而定義的。
MsgWaitForMultipleObjectsEx參數(shù)1為DWORD類型,參數(shù)2為LPHANDLE類型,參數(shù)3為DWORD類型,參數(shù)4為DWORD類型,參數(shù)5為DWORD類型。此函數(shù)是MsgWaitForMultipleObjects函數(shù)的擴展。將原來函數(shù)的參數(shù)3除掉,添加參數(shù)5為標志。標志有兩個值:0或MWMO_INPUTAVAILABLE。
如果一個線程既要執(zhí)行大量任務同時又要響應用戶的按鍵消息,這兩個專用于等待消息的函數(shù)將非常有用。
和事件有關的函數(shù)有:
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 );
事件對象是最常用的內(nèi)核模式同步方法。它包含一個使用計數(shù)和兩個BOOL變量。其中一個BOOL變量指定這個事件對象是自動重置還是手工重置。另一個BOOL變量指定當前事件對象處于有信號狀態(tài)還是無信號狀態(tài)。
函數(shù)CreateEvent創(chuàng)建一個事件對象,參數(shù)1必須為NULL,參數(shù)2指定是否手工重新設置事件對象的狀態(tài)。如果為FALSE,當?shù)却瘮?shù)接到信號并返回后此事件對象被自動置為無信號狀態(tài)。這時等待此事件對象的其它線程就不會被喚醒,因為事件對象已經(jīng)被置為無信號狀態(tài)。如果參數(shù)2設置為TRUE,當?shù)却瘮?shù)接到信號并返回后事件對象不會被自動置于無信號狀態(tài),其它等待此事件對象的線程都能夠被喚醒。用ResetEvent函數(shù)可以手工將事件對象置為無信號狀態(tài)。相反SetEvent函數(shù)將事件對象置為有信號狀態(tài)。PulseEvent函數(shù)將事件對象置為有信號狀態(tài),然后立即置為無信號狀態(tài),在實際開發(fā)中這個函數(shù)很少使用。OpenEvent函數(shù)打開已經(jīng)創(chuàng)建的事件對象,一般用于不同進程內(nèi)的線程同步。在調(diào)用CreateEvent創(chuàng)建一個事件對象時,傳遞一個名字給參數(shù)4,這樣在其它進程中的線程就可以調(diào)用OpenEvent函數(shù)并指定事件對象的名字,來訪問這個事件對象。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- C語言多線程的詳細教程資料說明 10次下載
- 關于進程與線程的解析PDF文件資料
- windows應用程序讀取進程的內(nèi)存工具免費下載 1次下載
- Windows CE 進程、線程和內(nèi)存管理三 0次下載
- Windows CE 進程、線程和內(nèi)存管理一 0次下載
- Windows CE 電源管理解析 0次下載
- 基于Windows 操作系統(tǒng)內(nèi)核驅(qū)動的多核CPU 線程管理 0次下載
- 用多線程實現(xiàn)GPS接收機與PDA在Windows CE下的串口通 5次下載
- Windows CE詳解 67次下載
- 基于Windows CE的GPS串行通信的實現(xiàn)
- 基于Windows CE的數(shù)控軟件開發(fā)與實現(xiàn)
- 基于Windows CE嵌入式系統(tǒng)的智能小區(qū)廣告機的設計
- Windows線程、窗口與消息內(nèi)在機制研究
- Windows CE下多線程串口通信
- WINDOWS核心編程 (pdf下載)
- Python中多線程和多進程的區(qū)別 1.4k次閱讀
- 線程是什么的基本單位 進程與線程的本質(zhì)區(qū)別 1.9k次閱讀
- 進程和線程的概念及其區(qū)別 2.3k次閱讀
- RTOS中的線程、進程和協(xié)程詳解 2.9k次閱讀
- 關于Python多進程和多線程詳解 1.6k次閱讀
- Java多線程的用法 1.5k次閱讀
- 程序中進程和線程的區(qū)別 1.5k次閱讀
- 進程(線程)精細化控制中方法的使用 1.1k次閱讀
- 什么是多線程 2.7k次閱讀
- 為什么在JVM中線程崩潰不會導致JVM進程崩潰呢? 1.1k次閱讀
- 基于Windows NT多線程實現(xiàn)智能蓄電池遠程監(jiān)控系統(tǒng)的設計 2.4k次閱讀
- 如何管理Linux 的內(nèi)存分頁? 4.2k次閱讀
- 如何避免僵尸進程,多線程的實現(xiàn)原理 8.8k次閱讀
- Windows CE.NET 4.2下的串行通信技術講解 2k次閱讀
- 一文讀懂線程、進程、程序之間的不同 1.6k次閱讀
下載排行
本周
- 1冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說明書
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費
- 4丹佛斯2800系列變頻器說明書
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開關型降壓3.5A單節(jié)鋰電池充電管理電路技術手冊
- 0.74 MB | 1次下載 | 免費
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測距模塊產(chǎn)品手冊
- 0.43 MB | 1次下載 | 免費
- 8SDFM 激光測距模塊模組手冊
- 0.54 MB | 1次下載 | 免費
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場分析及創(chuàng)新應用
- 3.11 MB | 43次下載 | 免費
- 3RV1126B系列開發(fā)板產(chǎn)品資料
- 4.19 MB | 18次下載 | 免費
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開發(fā)板 四核異構(gòu)、3路千兆網(wǎng),賦能多元化工業(yè)場景
- 3.05 MB | 12次下載 | 免費
- 6【開源】60余套STM32單片機、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項目案例及入門學習資源包
- 10.55 MB | 8次下載 | 免費
- 7冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車載充電機主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191448次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論