除 lock (C#) / SyncLock (VB) 外,C++/CLI 可直接使用 Monitor 靜態方法與 Thread 靜態方法進行精細控制。
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");
}
SetMessage 鎖定、更新、Pulse 喚醒消費者。Wait 釋放鎖並休眠,被喚醒後處理訊息,循環等待下一條。cmt->Join() 返回。pmt->Interrupt() 中斷消費者 Wait,拋出例外退出迴圈。pmt->Join() 確認消費者結束,主執行緒結束。AutoResetEvent / ManualResetEvent:核心事件物件,跨進程同步。Mutex:跨進程互斥體。Semaphore:資源計數控制。ReaderWriterLock:讀寫分離鎖。Interlocked:原子操作 (Increment, Exchange, CompareExchange)。選擇原則:同進程簡單互斥用 Monitor/lock;需跨進程或核心物件語意用 Event/Mutex/Semaphore;高效能計數用 Interlocked。