(Post 11/12/2007) Một luồng có thể bị tạm ngừng và tiếp tục một cách rõ ràng thông qua các phương thức Thread.Suspend và Thread.Resume. Cơ chế này hoàn toàn tách biệt với cơ chế chặn đã thảo luận trước đây. Cả hai hệ thống đều độc lập và hoạt động song song.

  • Phần 1: Tổng quan và khái niệm
  • Phần 2: Tạo và bắt đầu chủ đề
  • Phần 3: Cơ bản về đồng bộ hóa
  • Phần 4: Khóa và an toàn chỉ
  • Phần 5: Ngắt và hủy bỏ
  • Phần 6: Trạng thái luồng
  • Phần 7: Xử lý Chờ
  • Phần 8: Bối cảnh đồng bộ hóa
  • Phần 9: Căn hộ và Hình thức Windows
  • Phần 10: BackgroundWorker
  • Phần 11: ReaderWriterLock
  • Phần 12: Tổng hợp luồng
  • Phần 13: Đại biểu không đồng bộ
  • Phần 14: Bộ hẹn giờ
  • Phần 15: Lưu trữ cục bộ
  • Phần 16: Đồng bộ hóa không chặn
  • Phần 17: Chờ và Xung (1)
  • Phần 17: Chờ và Xung (2)

Tạm dừng và tiếp tục

Một chủ đề có thể tạm ngưng chính nó hoặc một chủ đề khác. Việc gọi Tạm ngưng kết quả là chuỗi đi vào trạng thái SuspendRequested nhanh chóng, sau đó khi đạt đến điểm an toàn để thu gom rác, nó sẽ chuyển sang trạng thái Suspended. Từ đó, nó chỉ có thể được tiếp tục thông qua một luồng khác gọi phương thức Tiếp tục của nó. Tiếp tục sẽ chỉ hoạt động trên một chuỗi bị treo, không phải một chuỗi bị chặn.

Từ .NET 2.0, Tạm ngưng và Tiếp tục đã không còn được dùng nữa, việc sử dụng chúng không được khuyến khích vì sự nguy hiểm vốn có khi tự ý tạm dừng một chuỗi khác. Nếu một chuỗi giữ khóa trên một tài nguyên quan trọng bị treo, toàn bộ ứng dụng (hoặc máy tính) có thể bị khóa. Điều này nguy hiểm hơn nhiều so với việc gọi Abort – điều này sẽ dẫn đến việc bất kỳ ổ khóa nào như vậy được phát hành – ít nhất là về mặt lý thuyết – nhờ mã trong các khối cuối cùng.

Tuy nhiên, sẽ an toàn khi gọi Tạm dừng trên luồng hiện tại – và khi làm như vậy, người ta có thể triển khai một cơ chế đồng bộ hóa đơn giản – với một luồng công nhân trong một vòng lặp – thực hiện một tác vụ, tự gọi Tạm ngưng, sau đó chờ được tiếp tục (“ thức dậy ”) bởi luồng chính khi một tác vụ khác đã sẵn sàng. Tuy nhiên, khó khăn là kiểm tra xem công nhân có bị đình chỉ hay không. Hãy xem xét đoạn mã sau:

worker.NextTask = “MowTheLawn”;
if ((worker.ThreadState & ThreadState.Suspended)> 0)
worker.Resume;
else
// Chúng ta không thể gọi Resume vì luồng đã chạy.
// Báo hiệu cho worker bằng cờ thay thế:
worker.A AnotherTaskAwaits = true;

Đây là luồng không an toàn khủng khiếp – mã có thể được sử dụng tại bất kỳ điểm nào trong năm dòng này – trong thời gian đó, nhân viên có thể tiến vào và thay đổi trạng thái của nó. Mặc dù có thể khắc phục được, nhưng giải pháp này phức tạp hơn giải pháp thay thế – sử dụng cấu trúc đồng bộ hóa như AutoResetEvent hoặc Monitor.Wait. Điều này làm cho việc Tạm dừng và Tiếp tục trở nên vô dụng trên tất cả các lần đếm.

 

(Sưu tầm)

FPT Aptech trực thuộc Tổ chức Giáo dục FPT có hơn 25 năm kinh nghiệm đào tạo lập trình viên quốc tế tại Việt Nam, và luôn là sự lựa chọn ưu tiên của các sinh viên và nhà tuyển dụng.
0981578920
icons8-exercise-96