Trong các trường hợp nhất, biến cục bộ cụ thể cho một chuỗi, do đó các vấn đề liên quan đến volatile
là hoàn toàn không cần thiết.
Điều này thay đổi khi nào, như trong ví dụ của bạn, nó là một biến "bị bắt" - khi nó được thực hiện âm thầm như một trường trên một lớp do trình biên dịch tạo ra. Vì vậy, theo lý thuyết nó có thể là dễ bay hơi, nhưng trong hầu hết các trường hợp nó sẽ không có giá trị thêm phức tạp.
Cụ thể, một cái gì đó giống như Monitor
(còn gọi là lock
) với Pulse
v.v. cũng có thể làm điều này cũng như bất kỳ số lượng cấu trúc luồng khác.
Threading là khôn lanh, và một vòng lặp hoạt động hiếm khi cách tốt nhất để quản lý nó ...
Re chỉnh sửa ... secondThread.Join()
sẽ là điều hiển nhiên - nhưng nếu bạn thực sự muốn sử dụng một mã thông báo riêng, xem bên dưới. Lợi thế của điều này (trên những thứ như ManualResetEvent
) là nó không yêu cầu bất cứ điều gì từ hệ điều hành - nó được xử lý hoàn toàn bên trong CLI.
using System;
using System.Threading;
static class Program {
static void WriteLine(string message) {
Console.WriteLine(Thread.CurrentThread.Name + ": " + message);
}
static void Main() {
Thread.CurrentThread.Name = "Main";
object syncLock = new object();
Thread thread = new Thread(DoStuff);
thread.Name = "DoStuff";
lock (syncLock) {
WriteLine("starting second thread");
thread.Start(syncLock);
Monitor.Wait(syncLock);
}
WriteLine("exiting");
}
static void DoStuff(object lockHandle) {
WriteLine("entered");
for (int i = 0; i < 10; i++) {
Thread.Sleep(500);
WriteLine("working...");
}
lock (lockHandle) {
Monitor.Pulse(lockHandle);
}
WriteLine("exiting");
}
}
Nguồn
2009-06-23 12:21:51
Biến của bạn không phải là địa phương trong trường hợp này! Thay vào đó, nó là một biến cá thể trong một lớp do trình biên dịch tạo ra. –
Đó là một sự khác biệt ngữ nghĩa - về mặt mã, nó là một biến cục bộ xảy ra để bị bắt ... –
Cái tôi thấy 'là một biến cục bộ được cập nhật trong một luồng khác. Và mặc dù tôi biết trình biên dịch sẽ tạo ra một biến cá thể của biến cục bộ của tôi, trình biên dịch tiền trước dường như không hoặc là 'quá bướng bỉnh' để thừa nhận nó. –