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

Có vẻ như ConcurrentBag không an toàn cho luồng

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

Tôi đã viết một chương trình trong đó phương thức xây dựng danh sách trả về một chuỗi IEnumerable chứa một số lượng lớn chuỗi (1 triệu mục) mà tôi lưu trữ trong Danh sách chuỗi và sau đó nó nối tất cả các mục vào Song song .Foreach trong phiên bản StringBuilder. Sau đó tôi in stringBuilderInstance.Length .

Vấn đề là nó ít hơn 1.000.000. sau một sốtìm kiếm trên Google , tôi nhận ra rằng bộ sưu tập Danh sách không an toàn theo luồng, điều này đã gây ra sự cố này. Vì vậy tôi nghĩ ra 2 giải pháp:

1) Sử dụngKhóa

2) Sử dụngTúi đồng thời

Khi tôi sử dụng lock thì không vấn đề gì, chiều dài là 1 triệu, nhưng:

Khi tôi sử dụng ConcurrentBag của một chuỗi, độ dài ngắn hơn tôi mong đợi!

Nguyên nhân sâu xa của vấn đề này là gì?

Phương pháp tạo danh sách:

Danh sách tĩnh công khai CreateList()
{
Danh sách result = Danh sách mới();
cho (int i = 0; i < 1000000; i++)
{
result.Add(1.ToString());
}
return result;
}

Sử dụng gói đồng thời:

khoảng trống tĩnh công khai DoWithParallel_ThreadSafe()
{
ConcurrentBag listOfString = new ConcurrentBag(CreateList());
StringBuilder a = new StringBuilder();
Hành động nối thêm = (số) =>
{
a.Thêm(số);
};
Parallel.ForEach(listOfString, phần bổ sung);
Console.WriteLine($"Chiều dài của trình tạo chuỗi: {a.Length}");
}

Sử dụng khóa:

khoảng trống tĩnh công khai DoWithParallel_UnsafeThread_Lock()
{
Danh sách listOfString = CreateList();
StringBuilder a = new StringBuilder();
Hành động nối thêm = (số) =>
{
khóa(listOfString)
{
a.Thêm(số);
}
};
Parallel.ForEach(listOfString, phần bổ sung);
Console.WriteLine($"Chiều dài của trình tạo chuỗi: {a.Length}");
}

Nội dung chính:

static void Main(string[] args)
{
DoWithParallel_UnsafeThread_Lock();
DoWithParallel_ThreadSafe();
Console.ReadKey();
}

提前谢谢你。

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

StringBuilder Không thể thay đổi từ bên trong đa luồng, do đó mã không hoạt động khi bạn cố gắng thực hiện việc này. Lưu ý rằng việc khóa không có ý nghĩa gì; chỉ cần không tạo nhiều luồng để thực hiện công việc ngay từ đầu, vì công việc không thể được thực hiện từ nhiều luồng. Vì bạn sẽ không bao giờ truy cập từ nhiều chủ đề Túi đồng thời, vì vậy hãy sử dụng nó thay vì List Nó không có ý nghĩa gì cả.

Về C# - có vẻ như ConcurrentBag không an toàn cho luồng, 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/45425006/

28 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
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