Windows mặc định để tự động, khóa tập tin bắt buộc. UNIX mặc định để thủ công, khóa tập tin hợp tác. Trong cả hai trường hợp, mặc định có thể được ghi đè, nhưng trong cả hai trường hợp, chúng thường không.
Rất nhiều mã Windows cũ sử dụng API C / C ++ (các chức năng như fopen
) thay vì API gốc (các chức năng như CreateFile
). API C / C ++ cung cấp cho bạn không có cách nào để chỉ định cách khóa bắt buộc sẽ hoạt động, do đó bạn nhận được mặc định. "Chế độ chia sẻ" mặc định có xu hướng cấm các hoạt động "xung đột". Nếu bạn mở một tệp để viết, ghi được coi là xung đột, ngay cả khi bạn không bao giờ thực sự ghi vào tệp. Ditto cho đổi tên.
Và, đây là nơi nó trở nên tồi tệ hơn. Khác với việc mở để đọc hoặc ghi, API C / C ++ không cung cấp cách nào để chỉ định những gì bạn định làm với tệp. Vì vậy, API phải cho rằng bạn sẽ thực hiện bất kỳ hoạt động hợp pháp nào. Kể từ khi khóa là bắt buộc, một open
mà cho phép một hoạt động mâu thuẫn sẽ bị từ chối, thậm chí nếu mã không bao giờ có ý định để thực hiện các hoạt động mâu thuẫn nhưng chỉ mở tập tin cho mục đích khác.
Vì vậy, nếu mã sử dụng API C / C ++ hoặc sử dụng API gốc mà không suy nghĩ cụ thể về các vấn đề này, họ sẽ ngăn chặn tập hợp tối đa các hoạt động có thể có cho mọi tệp họ mở và không thể mở tệp trừ khi mọi thao tác có thể xảy ra có thể thực hiện trên nó một khi đã mở là không tin.
Theo tôi, phương pháp Windows sẽ hoạt động tốt hơn nhiều so với phương pháp UNIX nếu mọi chương trình chọn chế độ chia sẻ và chế độ mở một cách khôn ngoan và xử lý triệt để các trường hợp thất bại. Tuy nhiên, phương thức UNIX hoạt động tốt hơn nếu mã không bận tâm để nghĩ về những vấn đề này. Thật không may, API C / C ++ cơ bản không ánh xạ tốt vào API tệp Windows theo cách xử lý các chế độ chia sẻ và xung đột mở tốt. Vì vậy, kết quả mạng là một chút lộn xộn.