首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

Win32 組合語言教程:多執行緒程式設計與執行緒間通訊

     編輯:組合語言

前言

多執行緒讓單一進程內並發執行多條指令流,提升回應性與吞吐量。本文說明執行緒分類、CreateThread 建立機制、三種執行緒間通訊模式(全域變數、視窗訊息、事件對象),並提供 MASM 範例展示 UI 執行緒與工作執行緒協作模式。

執行緒分類

  • UI 執行緒:擁有訊息迴圈,處理視窗訊息。Win9x 遵循 USER/GDI 互斥原則(單執行緒進入核心),WinNT 無此限制。
  • 工作執行緒:無訊息迴圈,專注背景運算、I/O 等任務。

建議架構:主執行緒專司 UI,耗時運算委派工作執行緒,避免介面凍結。

CreateThread 參數詳解

CreateThread proto lpThreadAttributes:DWORD,
                   dwStackSize:DWORD,
                   lpStartAddress:DWORD,
                   lpParameter:DWORD,
                   dwCreationFlags:DWORD,
                   lpThreadId:DWORD
  • lpStartAddress:執行緒函式入口,簽名 DWORD WINAPI ThreadProc(LPVOID)
  • dwCreationFlags:0=立即執行,CREATE_SUSPENDED=暫停建立,稍後 ResumeThread 啟動
  • 返回執行緒控制碼,若不需 WaitForSingleObject 等待結束,應立即 CloseHandle。

執行緒間通訊三大模式

模式適用場景優點缺點
全域變數同進程內所有執行緒簡單直接,無系統呼叫開銷需自行處理同步(Critical Section, Mutex 等),除錯困難
視窗訊息UI 執行緒間、或工作執行緒→UI 執行緒系統內建序列化,無競爭條件工作執行緒無訊息佇列,無法接收訊息
事件對象任意執行緒同步、喚醒核心級同步,高效低佔用僅適合訊號通知,不適合傳遞複雜資料

混合策略:UI 執行緒 ← 訊息 ← 工作執行緒 → 全域旗標 → UI 執行緒

UI 執行緒 --自訂訊息(PostMessage)--> 工作執行緒
工作執行緒 --全域旗標/事件--> UI 執行緒

範例一:基本多執行緒(工作執行緒完成通知 UI)

主視窗選單「Create Thread」啟動工作執行緒執行 6 億次加法,完成後 PostMessage(hwnd, WM_FINISH, 0, 0) 通知 UI 執行緒彈出訊息框。WM_FINISH = WM_USER + 0x100 避免與系統訊息衝突。

工作執行緒主體

ThreadProc PROC USES ecx Param:DWORD
  mov ecx, 600000000
  Loop1:
    add eax, eax
    dec ecx
    jz Get_out
    jmp Loop1
  Get_out:
    invoke PostMessage, hwnd, WM_FINISH, NULL, NULL
    ret
ThreadProc ENDP

UI 執行緒訊息處理

.ELSEIF uMsg==WM_FINISH
  invoke MessageBox, NULL, ADDR SuccessString, ADDR AppName, MB_OK

範例二:可控制的工作執行緒(全域旗標停止)

擴充上例:選單新增「Kill Thread」,設全域 CommandFlag=TRUE;工作執行緒迴圈中檢測旗標,為真則跳出結束。

; 資料段
CommandFlag BOOL FALSE

; 選單處理
.if ax==IDM_KILL_THREAD
  mov CommandFlag, TRUE
  ...

; 工作執行緒迴圈
.WHILE ecx!=0
  .if CommandFlag==TRUE
    jmp Get_out
  .endif
  add eax, eax
  dec ecx
.ENDW

進階同步:事件對象

參考前文(事件對象教程),使用 CreateEvent + WaitForSingleObject 實現「啟動/暫停/繼續」精確控制,避免輪詢旗標浪費 CPU。

實作最佳實務

  1. 最小化共享資料:傾向訊息傳遞而非共享記憶體。
  2. 關閉不需的控制碼:CreateThread 返回控制碼若不等待執行緒結束,立即 CloseHandle。
  3. 避免在 DllMain 呼叫同步物件:易造成死結。
  4. 使用 Thread Local Storage (TLS):執行緒私有資料避免鎖競爭。
  5. 結構化例外處理 (SEH):執行緒函式頂層包裝 __try/__except 防止未處理例外導致進程崩潰。

總結

Win32 多執行緒核心在於 CreateThread 建立、訊息機制跨執行緒通訊(UI 端)、事件/旗標同步(工作端)。掌握「主執行緒做 UI、工作執行緒做運算」分工原則,配合 PostMessage 非阻塞通知與事件對象精確同步,即能編寫高回應性、穩定的多執行緒應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved