2012-03-05 18 views
12

Tôi có thể cố gắng tạo một thư mục cùng một thư mục từ hai chủ đề khác nhau mà không có một trong số chúng ném ngoại lệ hoặc gặp sự cố khác không?Có phải CreateDirectory() trong C# thread-safe không?

Lưu ý rằng theo số MSDN, bạn có thể gọi số CreateDirectory() trên thư mục đã tồn tại, trong trường hợp đó, phương pháp dự kiến ​​sẽ không làm gì cả.

Trả lời

13

Chính cuộc gọi Directory.CreateDirectory là an toàn để tạo từ nhiều chuỗi. Nó sẽ không làm hỏng chương trình hoặc trạng thái hệ thống tập tin nếu bạn làm như vậy.

Tuy nhiên, không thể gọi số Directory.CreateDirectory theo cách như vậy để đảm bảo nó sẽ không ném ngoại lệ. Hệ thống tệp là một con thú không thể đoán trước có thể được thay đổi bởi các chương trình khác ngoài tầm kiểm soát của bạn tại bất kỳ thời điểm nào. Nó rất có thể cho ví dụ để thấy những điều sau đây xảy ra

  • Chương trình 1 Chủ đề 1: Gọi CreateDirectory cho c:\temp\foo và nó thành công
  • Chương trình 2 Chủ đề 1: Loại bỏ quyền truy cập vào c:\temp từ chương trình 1 người
  • Chương trình 1 Chủ đề 2: Gọi CreateDirectory và ném do thiếu truy cập

Nói tóm lại bạn phải thừa nhận rằng Directory.CreateDirectory, hoặc thực sự bất kỳ chức năng mà chạm vào hệ thống tập tin, có thể và sẽ t hrow và xử lý cho phù hợp.

6

Từ MSDN docs on Directory:

Bất kỳ public static (chung trong Visual Basic) thành viên của loại này là chủ đề an toàn. Bất kỳ thành viên cá thể nào cũng không được bảo đảm là luồng an toàn.

Do đó, vì CreateDirectory là tĩnh, vâng, đó là luồng an toàn.

Điều đó cho biết: như @JaredPar chỉ ra, các vấn đề về an toàn chủ đề không phải là lý do duy nhất khiến một phương pháp có thể ném ngoại lệ. Có vô số lý do tại sao một cuộc gọi hệ thống tập tin có thể ném một ngoại lệ (trong mọi trường hợp, đa luồng hay không), và bạn cần phải tính toán cho những điều đó.

Bằng cách nói rằng đó là chủ đề an toàn I (và MSDN) chỉ ngụ ý cách giải nghĩa rất rõ ràng, nghĩa là "phương pháp này không sửa đổi trạng thái chương trình được chia sẻ theo cách có thể gây ra trạng thái không hợp lệ, điều kiện chủng tộc hoặc các hiệu ứng bất lợi khác thường được liên kết với mã đa luồng không an toàn "

+0

Điều này không giải quyết được vấn đề mặc dù nó sẽ ném từ một hoặc cả hai chủ đề – JaredPar

+0

True- Tôi tin câu trả lời của bạn bao gồm tốt hơn (tôi upvoted btw). Tôi sẽ sửa đổi câu trả lời của tôi. –

4

Để xây dựng câu trả lời của @ JaredPar, bạn có điều kiện chạy đua trên tay. Nếu cuộc gọi đầu tiên tạo thư mục hoàn toàn, và chỉ khi đó cuộc gọi thứ hai bắt đầu, mọi thứ sẽ ổn. Tuy nhiên,

tuy nhiên, nếu cuộc gọi thứ hai tiếp cận hệ điều hành trong khi vẫn đang xử lý đầu tiên, hệ điều hành có thể bị lỗi do lỗi thứ hai khóa các sự cố và bạn sẽ bị ngoại lệ.

Vẫn là chủ đề an toàn theo nghĩa là bạn sẽ không nhận được bất kỳ thư mục không thể đoán trước nào được tạo hoặc không có thư mục nào cả.

Để xây dựng - trong khi tôi không chắc chắn 100% rằng Windows không có điều kiện chủng tộc nội bộ khi cùng một thư mục được tạo hai lần đồng thời, tôi chắc chắn bạn sẽ không thể chuyển đĩa vào làm điều đó, hoặc có một bế tắc với cả hai sáng tạo bị mắc kẹt cho đến chết. Một trong số họ sẽ thành công, người kia sẽ thất bại, nhưng thư mục sẽ được tạo ra.

Vì vậy, chẩn đoán của bạn, chỉ để được hoàn toàn chắc chắn, nên này:

  • Create Directory
  • Nếu nó không thành công, phải đợi một khoảng thời gian ngẫu nhiên (ví dụ, giữa 0,2 và 0,5 giây) và thử lại.
  • Nếu nó không liên tục (nói, 3 lần liên tiếp), bạn có một vấn đề ở bàn tay của bạn - không có quyền truy cập vào các thư mục, một đĩa đầy đủ, vv ..

    Ngẫu nhiên, tại sao không tạo ra các thư mục một lần khi ứng dụng bắt đầu chạy?

+0

bạn có chắc chắn về điều này không? Ý định của tôi là có một số chủ đề khác nhau tạo (riêng biệt) các tệp nhật ký trong cùng một thư mục, tạo nó nếu cần. Giả sử bạn là chính xác, và việc tạo thư mục không phải là một hoạt động nguyên tử, tôi phải sử dụng (ví dụ) một khóa để đồng bộ hóa nó. "Thread-safe" về CreateDirectory() sau đó là gì? – bavaza

+0

Tôi sẽ xây dựng. – zmbq

+0

Cảm ơn. Tôi nghĩ đây có thể là hành vi mà tôi thấy. –

Các vấn đề liên quan