在 C++Builder(CB)環境下開發多線程應用,憑藉 VCL 的 TThread 類別與同步組件封裝,較 Visual C++ 更直觀易用。本文分享實戰中總結的關鍵技術點與避坑指南。
CB 最大亮點在於 直接訪問主 VCL 線程控件。多線程需更新 UI 時,只需將訪問代碼包裹在 Synchronize() 方法中即可自動切換到主線程執行,無需手動發送消息或使用複雜的跨線程調度。
TThread::WaitFor 與 OnTerminate 事件ReturnValue 屬性),便於主線程判斷執行狀態。__thread 變數)。finally 區塊,無論 Execute() 執行到哪裡都會被調用。TEvent:線程同步核心封裝 Windows Event 核心物件,提供 WaitFor(timeout) 方法,返回值語義清晰:
| 返回值 | 含義 |
|---|---|
wrSignaled | 事件被觸發,同步成功 |
wrTimeout | 等待超時 |
wrAbandoned | 事件物件在超時前被銷毀 |
wrError | 發生錯誤,查 LastError 獲取詳情 |
注意:timeout = INFINITE 易導致程式假死,建議設定合理超時並處理 wrTimeout。
TCriticalSection:臨界區封裝對應 Windows Critical Section,用於保護共享變數訪問:
TCriticalSection* pSection = new TCriticalSection();
pSection->Enter(); // 進入臨界區,加鎖
shared_counter++;
pSection->Leave(); // 離開臨界區,解鎖
delete pSection;
務必保證 Enter/Leave 配對,異常安全建議搭配 RAII 包裹。
TMultiReadExclusiveWriteSynchronizer:讀寫鎖解決「多讀單寫」場景(生產者-消費者模型):
BeginRead() / EndRead() — 多線程可並發讀取。BeginWrite() / EndWrite() — 獨佔寫入,阻塞所有讀寫。需定義為全域變數供多線程共享。
Synchronize() 或 Queue()。TCriticalSection 或 TMultiReadExclusiveWriteSynchronizer)。OnTerminate,勿在 Execute 中直接刪除自身。INFINITE 等待,設定超時並處理超時邏輯。TEvent 實現線程間通知與協作。C++Builder 的多線程框架將 Windows 底層 API 封裝得極為友善,掌握上述核心類別與最佳實踐,即可高效開發穩健的多線程應用。