Từ các cuộc thảo luận tôi đã thấy có vẻ như hoạt động nguyên tử và an toàn luồng là như nhau, nhưng rất nhiều người nói rằng chúng khác nhau. Bất cứ ai có thể cho tôi biết sự khác biệt nếu có một?
Từ các cuộc thảo luận tôi đã thấy có vẻ như hoạt động nguyên tử và an toàn luồng là như nhau, nhưng rất nhiều người nói rằng chúng khác nhau. Bất cứ ai có thể cho tôi biết sự khác biệt nếu có một?
Câu trả lời:
Hoạt động nguyên tử là một cách để đạt được sự an toàn của luồng bằng cách sử dụng một số loại khóa như Mutexes hoặc Semaphores sử dụng hoạt động nguyên tử trong nội bộ hoặc bằng cách thực hiện đồng bộ hóa khóa miễn phí bằng cách sử dụng hàng rào nguyên tử và bộ nhớ.
Vì vậy, các hoạt động nguyên tử trên các loại dữ liệu nguyên thủy là một công cụ để đạt được sự an toàn của luồng nhưng không đảm bảo an toàn luồng tự động vì thông thường bạn có nhiều hoạt động dựa vào nhau. Bạn phải đảm bảo rằng các thao tác này được thực hiện mà không bị gián đoạn, ví dụ như sử dụng Mutexes.
Đúng, viết một trong những kiểu dữ liệu nguyên tử này trong c # là luồng an toàn, nhưng điều đó không làm cho chức năng bạn sử dụng chúng trong luồng an toàn. Nó chỉ đảm bảo rằng việc ghi đơn được thực thi chính xác ngay cả khi một luồng thứ hai truy cập nó "cùng một lúc". Không bao giờ ít hơn, lần đọc tiếp theo từ luồng hiện tại không được đảm bảo để có được giá trị được viết trước đó như một luồng khác có thể đã được ghi cho nó, chỉ có điều giá trị đọc là hợp lệ.
Nguyên tử và an toàn luồng là hai thứ khác nhau. Nguyên tử đề cập đến chất lượng "tất cả hoặc không có gì" của một hoạt động; nếu một hoạt động không thể được thực hiện thành công 100%, thì hệ thống sẽ vẫn ở trạng thái chung trước khi bất kỳ phần nào của hoạt động bắt đầu. Ví dụ cổ điển là một giao dịch cơ sở dữ liệu; Khi lưu hóa đơn, bao gồm tiêu đề và nhiều chi tiết đơn hàng, mọi phần của mỗi hàng cơ sở dữ liệu phải được đặt thành công; nếu không, dữ liệu bị mất hoặc bị hỏng. Nếu một mục hàng không thể được chèn, thì không chỉ không nên chèn các hàng khác mà còn không có hàng nào được xử lý.
An toàn luồng đề cập đến sự kết hợp của nhiều thứ, bao gồm cả nguyên tử, cho phép một hoạt động được "tái xuất"; nhiều công nhân có thể thực hiện cùng một hoạt động, bắt đầu từ cùng một thời điểm hoặc khác nhau, mà không ảnh hưởng đến bất kỳ công việc nào khác. Có nhiều mô hình cho hoạt động an toàn luồng; hầu hết trong số họ sôi sục về mặt khái niệm để chạy nhiều tác vụ song song trong sự cô lập hoàn toàn (hai công nhân có thể thực hiện cùng một nhiệm vụ trên hai đối tượng hoặc bộ sưu tập đối tượng khác nhau mà không hề biết công nhân kia thậm chí tồn tại) hoặc thiết lập một "đường ống" trong đó nhiều công nhân mỗi người thực hiện một nhiệm vụ trong toàn bộ hoạt động (mỗi công nhân tiến triển từ nhiệm vụ đầu tiên sang công việc tiếp theo, hoặc người khác tập trung vào một nhiệm vụ và giao "sản phẩm công việc" trung gian cho công nhân tiếp theo).
Một hoạt động nguyên tử là một hoạt động không thể bị gián đoạn.
Một chủ đề an toàn là một chủ đề có thể bị gián đoạn một cách an toàn.
An toàn luồng có được với các hoạt động nguyên tử, đặc biệt là trong logic ngăn chặn các tài nguyên quan trọng được truy cập nhiều lần.
Hoạt động nguyên tử cơ bản là Test-and-set , được sử dụng để thực hiện các semaphores, lần lượt được sử dụng để thực hiện an toàn luồng.
An toàn luồng là nhiều hơn một khung hoặc một "khái niệm", hoạt động nguyên tử là một tập hợp con, một phương tiện (một trong nhiều) để đạt được trạng thái là được phân loại 'an toàn luồng'.
An toàn luồng đề cập đến một quá trình có thể được truy cập bởi các luồng riêng biệt, trong đó quyền truy cập của một (và thao tác dữ liệu), sẽ không làm hỏng tính toàn vẹn của hoạt động của các luồng khác.
Phần lớn kỹ năng của lập trình viên là biết cách đạt được điều này, tùy thuộc vào tình huống và mục tiêu chính, bạn có thể cần phải thực hiện, ví dụ: khóa, semaphores, chốt, đối tượng nguyên tử, quy tắc đồng bộ hóa, v.v ...