cuốn sách gpt4 ai đã làm

c# - Tìm hiểu các vòng lặp Parallel.For và các biến cục bộ

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 18:51:08 25 4
mua khóa gpt4 Nike

Tôi mới làm quen với tính toán song song và tôi gặp một số vấn đề khi chạy Parallel.For trong C#. Tôi đang cố gắng truy cập nhiều trang web cùng lúc, lấy HTML và đăng ký chúng vào nhiều cơ sở dữ liệu SQLite. Mọi thứ có vẻ ổn cho đến khi tôi kiểm tra kết quả chính xác hơn. Tôi nhận thấy rằng trong vòng lặp từ 0 đến 20, mã được nhập 20 lần ở phần chia sẻ của vòng lặp nhưng chỉ 16 lần ở phần cục bộ. Vì vậy thiếu 4 kết quả. Để hiểu vấn đề này, tôi đã trải nghiệm việc chỉ đặt hai quầy. Một trong phần toàn cầu và một trong phần địa phương. Đầu ra của tổng số là 20 và ở phần cục bộ là 1! Sau đó tôi ngủ trong 2 giây trước khi phần toàn cầu quay lại phần cục bộ. Trong trường hợp này, đầu ra của tổng số là 20, trong khi phần cục bộ là 13! Bạn có thể giải thích tôi đang làm gì sai không?

khoảng trống tĩnh ParalellCalc()
{
var tm = Đồng hồ bấm giờ mới();
tm.Start();
số int = 0;
int count2 = 0;
var parl = Parallel.For(0, 20, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount}, () => 0, (i, state, Enrada) =>
{
count++;
Thread.Sleep(2000);
trả lại Enrada;
},
(x) =>
{
đếm2++;
}
);

tm.Stop();
Console.WriteLine(tm.Elapsed);
Console.WriteLine("Toàn cầu: " + count.ToString());
Console.WriteLine("Local: " + count2.ToString());
Console.WriteLine(tm.Elapsed);
tm.Reset();
}

biên tập:Tôi đã làm theo lời khuyên của bạn và thực hiện ví dụ tương tự bằng cách sử dụng Interlocked.Increment để tăng bộ đếm. Kết quả là hoàn toàn giống nhau. Nếu tôi xóa Thread.Sleep(2000), bộ đếm thứ hai sẽ cho kết quả là 1!? Nếu tôi không xóa nó sẽ tạo ra 16 kết quả. Bộ đếm đầu tiên hiển thị giá trị 20 trong mọi trường hợp. Có ai có thể giải thích được không?

khoảng trống tĩnh ParalellCalc()
{
var tm = Đồng hồ bấm giờ mới();
tm.Start();
số int = 0;
int count2 = 0;
var parl = Parallel.For(0, 20, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount}, () => 0, (i, state, Enrada) =>
{
Interlocked.Increment(số lượt tham chiếu);
trả lại Enrada;
},
(x) =>
{
Interlocked.Increment(ref count2);
});

tm.Stop();
Console.WriteLine(tm.Elapsed);
Console.WriteLine("Toàn cầu: " + count.ToString());
Console.WriteLine("Local: " + count2.ToString());
Console.WriteLine(tm.Elapsed);
tm.Reset();
}

câu trả lời hay nhất

++ Toán tử không an toàn cho luồng vì nó không phải là nguyên tử. Khóa liên động.Tăng dầnChủ đề có an toàn không. Interlocked.Increment(số lượt tham chiếu) thay vì đếm++đếm2 Việc đếm có thể được cố định.

Về C# - Tìm hiểu các vòng lặp Parallel.For và các biến cục bộ, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/59204029/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress