Monitor、lock / SyncLock)。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 完成通知等場景。