<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>Windows CE 進程、線程和內存管理二

Windows CE 進程、線程和內存管理二

2017-11-08 | rar | 0.3 MB | 次下載 | 1積分

資料介紹

 Windows CE 進程、線程和內存管理(二)
  2006-12-09 17:50:44 來源:嵌入式資訊網
  分享到: 二、同步
  在多數情況下,線程之間難免要相互通信、相互協調才能完成任務。比如,當有多個線程共同訪問同一個資源時,就必須保證一個線程正讀取這個資源數據的時候,其它線程不能夠修改它。這就需要線程之間相互通信,了解對方的行為。再有當一個線程要準備執行下一個任務之前,它必須等待另一個線程終止才能運行,這也需要彼此相互通信。實際開發過程中,線程間需要同步的情況非常多。Windows CE.NET給我們提供了很多的同步機制,熟練的掌握這些機制并合理運用會使線程之間的同步更合理、更高效。進程間的通信機制在下一篇文章中講解。
  Windows CE.NET具有兩種運行模式:用戶模式和內核模式。并且允許一個運行于用戶模式的應用程序隨時切換為內核模式,或切換回來。線程同步的有些解決辦法運行在用戶模式,有些運行在內核模式?!禬indows核心編程》上說從用戶模式切換到內核模式再切換回來至少要1000個CPU周期。我查看過CE下API函數SetKMode的源碼,這個函數用于在兩種模式間切換,改變模式只需修改一些標志,至于需要多少個CPU周期很難確定。但至少可以肯定來回切換是需要一定時間的。所以在選擇同步機制上應該優先考慮運行在用戶模式的同步解決辦法。
  1、互鎖函數
  互鎖函數運行在用戶模式。它能保證當一個線程訪問一個變量時,其它線程無法訪問此變量,以確保變量值的唯一性。這種訪問方式被稱為原子訪問?;ユi函數及其功能見如下列表:
  函數參數和功能
  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函數并指定事件對象的名字,來訪問這個事件對象。
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統的設計與實現
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發板設計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>