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

實例解析 C++/CLI 多執行緒:多任務、同步化與監視器

     編輯:VC 教學

基本概念

  • 執行緒:單一執行流,擁有獨立暫存器與堆疊。單核心下透過時間片輪轉與上下文切換實現並發。
  • 進程:位址空間容器,至少含一條主執行緒。進程內所有執行緒共享記憶體與資源。
  • 多執行緒:將工作分解為子任務,由不同執行緒平行執行,提高回應性與吞吐量。
  • 原子性:讀寫操作不可分割 (位元組、字、大多數 CLI 基本型別)。複雜物件 (Point、陣列) 非原子,需同步。
  • 同步鎖:CLI 為每個物件提供隱含同步鎖 (Monitor、lock / SyncLock)。

Monitor 範例:生產者/消費者

using namespace System;
using namespace System::Threading;

ref class MessageBuffer {
    String^ msg;
public:
    void SetMessage(String^ s) {
        Monitor::Enter(this);
        msg = s;
        Monitor::Pulse(this);   // 喚醒等待執行緒
        Console::WriteLine("Set: {0}", msg);
        Monitor::Exit(this);
    }
    void ProcessMessages() {
        Monitor::Enter(this);
        while (true) {
            try { Monitor::Wait(this); } // 釋放鎖並等待
            catch (ThreadInterruptedException^) { return; }
            Console::WriteLine("Processed: {0}", msg);
        }
        Monitor::Exit(this);
    }
};

ref class CreateMessages {
    MessageBuffer^ buf;
public:
    CreateMessages(MessageBuffer^ b) : buf(b) {}
    void Run() {
        for (int i=1; i<=5; i++) {
            buf->SetMessage("M-" + i);
            Thread::Sleep(2000);
        }
        Console::WriteLine("CreateMessages done");
    }
};

ref class ProcessMessages {
    MessageBuffer^ buf;
public:
    ProcessMessages(MessageBuffer^ b) : buf(b) {}
    void Run() { buf->ProcessMessages(); }
};

int main() {
    MessageBuffer^ m = gcnew MessageBuffer;
    Thread^ t1 = gcnew Thread(gcnew ThreadStart(gcnew CreateMessages(m), &CreateMessages::Run));
    Thread^ t2 = gcnew Thread(gcnew ThreadStart(gcnew ProcessMessages(m), &ProcessMessages::Run));
    t1->Start(); t2->Start();
    t1->Join(); t2->Interrupt(); t2->Join();
    Console::WriteLine("Main done");
}

關鍵點

  • Monitor::Enter/Exit 成對使用,建議用 try/finally 確保釋放。
  • Wait 釋放鎖並進入等待隊列;Pulse/PulseAll 喚醒一個/所有等待者。
  • Thread::Interrupt 喚醒 Wait/Sleep/Join 中的執行緒並拋出 ThreadInterruptedException。
  • Join 等待執行緒結束。

此模式適用於工作隊列、非同步 I/O 完成通知等場景。

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