Tôi đã đọc qua bài đăng tips and tricks và tôi nghĩ mình sẽ thử một số công cụ C# mà tôi chưa từng làm trước đây. Do đó, mã sau đây không phục vụ mục đích thực sự, nhưng chỉ là một 'chức năng kiểm tra' để xem điều gì xảy ra.C# ThreadStatic + các thành viên dễ bay hơi không hoạt động như mong đợi
Dù sao, tôi có hai lĩnh vực private static:
private static volatile string staticVolatileTestString = "";
[ThreadStatic]
private static int threadInt = 0;
Như bạn thấy, tôi đang thử nghiệm ThreadStaticAttribute và dễ bay hơi từ khóa.
Dù sao, tôi có một phương pháp thử nghiệm mà trông như thế này:
private static string TestThreadStatic() {
// Firstly I'm creating 10 threads (DEFAULT_TEST_SIZE is 10) and starting them all with an anonymous method
List<Thread> startedThreads = new List<Thread>();
for (int i = 0; i < DEFAULT_TEST_SIZE; ++i) {
Thread t = new Thread(delegate(object o) {
// The anon method sets a newValue for threadInt and prints the new value to the volatile test string, then waits between 1 and 10 seconds, then prints the value for threadInt to the volatile test string again to confirm that no other thread has changed it
int newVal = randomNumberGenerator.Next(10, 100);
staticVolatileTestString += Environment.NewLine + "\tthread " + ((int) o) + " setting threadInt to " + newVal;
threadInt = newVal;
Thread.Sleep(randomNumberGenerator.Next(1000, 10000));
staticVolatileTestString += Environment.NewLine + "\tthread " + ((int) o) + " finished: " + threadInt;
});
t.Start(i);
startedThreads.Add(t);
}
foreach (Thread th in startedThreads) th.Join();
return staticVolatileTestString;
}
gì tôi mong đợi để xem trở về từ chức năng này là kết quả như thế này:
thread 0 setting threadInt to 88
thread 1 setting threadInt to 97
thread 2 setting threadInt to 11
thread 3 setting threadInt to 84
thread 4 setting threadInt to 67
thread 5 setting threadInt to 46
thread 6 setting threadInt to 94
thread 7 setting threadInt to 60
thread 8 setting threadInt to 11
thread 9 setting threadInt to 81
thread 5 finished: 46
thread 2 finished: 11
thread 4 finished: 67
thread 3 finished: 84
thread 9 finished: 81
thread 6 finished: 94
thread 7 finished: 60
thread 1 finished: 97
thread 8 finished: 11
thread 0 finished: 88
Tuy nhiên, những gì Tôi nhận được thông báo này là:
thread 0 setting threadInt to 88
thread 4 setting threadInt to 67
thread 6 setting threadInt to 94
thread 7 setting threadInt to 60
thread 8 setting threadInt to 11
thread 9 setting threadInt to 81
thread 5 finished: 46
thread 2 finished: 11
thread 4 finished: 67
thread 3 finished: 84
thread 9 finished: 81
thread 6 finished: 94
thread 7 finished: 60
thread 1 finished: 97
thread 8 finished: 11
thread 0 finished: 88
Kết quả 'thứ hai' như mong đợi tại trường ThreadStatic đang hoạt động như tôi nghĩ), nhưng có vẻ như một vài đầu ra ban đầu đã bị 'bỏ qua' từ nửa đầu tiên.
Ngoài ra, các chuỗi trong nửa đầu tiên bị lỗi, nhưng tôi hiểu rằng một chuỗi không chạy ngay khi bạn gọi Start(); nhưng thay vào đó các điều khiển hệ điều hành bên trong sẽ bắt đầu các chủ đề khi nó phù hợp.
EDIT: Không có họ không, trên thực tế, tôi chỉ nghĩ rằng họ là bởi vì bộ não của tôi nhớ những con số liên tiếp
Vì vậy, câu hỏi của tôi là: Điều gì đang xảy ra sai gây ra cho tôi để mất một vài dòng trong đầu tiên 'nửa' của đầu ra? Ví dụ: chuỗi chủ đề 'thread 3' ở đâu là 84 '?
Tôi chạy mã của bạn một vài lần và luôn nhận được kết quả mong đợi ... –
Tôi cược rằng một nơi nào đó xuống dòng, cuộc gọi đến + = trên chuỗi là nhận được giá trị trước khi chuỗi trước đó đã thiết lập nó và chủ đề mới sẽ ghi đè nó bằng giá trị mới (do đó luồng 1 đã bị bỏ qua đầu ra). – Charleh
@DannyChen Tôi đang sử dụng lõi tứ và đó không phải là mã duy nhất chạy trong ứng dụng; không biết nếu một trong số đó sẽ có ý nghĩa. Tôi có thể tải lên toàn bộ mã ở đâu đó (chỉ có hai tệp .cs) nếu bạn muốn? – Xenoprimate