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

實例解析 C++/CLI 執行緒同步:Monitor、Interrupt、Join 進階應用

     編輯:VC 教學

延續上文:其他同步形式

除 lock (C#) / SyncLock (VB) 外,C++/CLI 可直接使用 Monitor 靜態方法與 Thread 靜態方法進行精細控制。

完整範例:訊息緩衝區 (同 134551 但更詳細)

using namespace System;
using namespace System::Threading;

ref class MessageBuffer {
    String^ messageText;
public:
    void SetMessage(String^ s) {
        Monitor::Enter(this);
        messageText = s;
        Monitor::Pulse(this); // 通知等待者
        Console::WriteLine("Set new message {0}", messageText);
        Monitor::Exit(this);
    }
    void ProcessMessages() {
        Monitor::Enter(this);
        while (true) {
            try {
                Monitor::Wait(this); // 等待 Pulse
            } catch (ThreadInterruptedException^) {
                Console::WriteLine("ProcessMessage interrupted");
                return;
            }
            Console::WriteLine("Processed new message {0}", messageText);
        }
        Monitor::Exit(this);
    }
};

ref class CreateMessages {
    MessageBuffer^ msg;
public:
    CreateMessages(MessageBuffer^ m) : msg(m) {}
    void CreateMessagesEntryPoint() {
        for (int i=1; i<=5; ++i) {
            msg->SetMessage("M-" + i.ToString());
            Thread::Sleep(2000);
        }
        Console::WriteLine("CreateMessages thread terminating");
    }
};

ref class ProcessMessages {
    MessageBuffer^ msg;
public:
    ProcessMessages(MessageBuffer^ m) : msg(m) {}
    void ProcessMessagesEntryPoint() {
        msg->ProcessMessages();
        Console::WriteLine("ProcessMessages thread terminating");
    }
};

int main() {
    MessageBuffer^ m = gcnew MessageBuffer;
    Thread^ cmt = gcnew Thread(gcnew ThreadStart(gcnew CreateMessages(m), &CreateMessages::CreateMessagesEntryPoint));
    Thread^ pmt = gcnew Thread(gcnew ThreadStart(gcnew ProcessMessages(m), &ProcessMessages::ProcessMessagesEntryPoint));
    cmt->Start(); pmt->Start();
    cmt->Join();        // 等待生產者結束
    pmt->Interrupt();   // 中斷消費者等待
    pmt->Join();        // 等待消費者結束
    Console::WriteLine("Primary thread terminating");
}

執行流程

  1. 主執行緒啟動生產者 (cmt) 與消費者 (pmt)。
  2. 生產者每 2 秒產生一條訊息,SetMessage 鎖定、更新、Pulse 喚醒消費者。
  3. 消費者 Wait 釋放鎖並休眠,被喚醒後處理訊息,循環等待下一條。
  4. 生產者結束 (5 條訊息),主執行緒 cmt->Join() 返回。
  5. 主執行緒 pmt->Interrupt() 中斷消費者 Wait,拋出例外退出迴圈。
  6. pmt->Join() 確認消費者結束,主執行緒結束。

進階同步類別

  • AutoResetEvent / ManualResetEvent:核心事件物件,跨進程同步。
  • Mutex:跨進程互斥體。
  • Semaphore:資源計數控制。
  • ReaderWriterLock:讀寫分離鎖。
  • Interlocked:原子操作 (Increment, Exchange, CompareExchange)。

選擇原則:同進程簡單互斥用 Monitor/lock;需跨進程或核心物件語意用 Event/Mutex/Semaphore;高效能計數用 Interlocked。

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