Dường như có rất nhiều điều để tìm hiểu về lập trình đa luồng và tất cả đều hơi đáng sợ.Cách đơn giản nhất để tạo toàn bộ một phương thức an toàn cho luồng?
Đối với nhu cầu hiện tại của tôi, tôi chỉ muốn bảo vệ chống lại một phương pháp được gọi là một lần nữa từ một thread trước khi nó kết thúc, và câu hỏi của tôi là:
Đây có phải là một đầy đủ (an toàn) cách để làm cho một phương pháp thread-an toàn?
class Foo
{
bool doingWork;
void DoWork()
{
if (doingWork) // <- sophistocated thread-safety
return; // <-
doingWork = true;
try
{
[do work here]
}
finally
{
doingWork = false;
}
}
}
Nếu điều đó không đủ, cách đơn giản nhất để đạt được điều này là gì?
EDIT: Thông tin thêm về các kịch bản:
Chỉ có một thể hiện của Foo
Foo.DoWork() sẽ được gọi từ một sợi ThreadPool trên Đã trôi qua sự kiện của System.Timers.Timer.
Thông thường Foo.DoWork() sẽ hoàn thành eons trước khi nó được gọi là , nhưng tôi muốn mã cho cơ hội mỏng sẽ chạy dài, và được gọi lại trước khi hoàn tất.
(Tôi cũng không đủ thông minh để chắc chắn nếu câu hỏi này có thể được gắn thẻ ngôn ngữ-agnostic, vì vậy tôi không có. Độc giả giác ngộ, cảm thấy tự do để làm như vậy nếu có.)
Đối tượng của loại Foo được khởi tạo cho mỗi chuỗi hay được chia sẻ qua nhiều luồng? – NotMe
Cung cấp thêm chi tiết về mã gọi phương thức dowork, có nhiều luồng không? – sll
Hoặc hỗ trợ ủy quyền lại hoặc thiết kế mã của bạn để nó không thể xảy ra.Chỉ cần bailing ra khi nó xảy ra là không có khả năng là giải pháp đúng. Nhưng chỉnh sửa của bạn làm cho nó rõ ràng rằng an toàn thread thực sự là vấn đề chứ không phải là entrancy. –