CreateDirectory()在C#中是否是线程安全的?

bav*_*aza 14 c# thread-safety create-directory

我可以安全地尝试从两个不同的线程创建相同的目录,而不会让其中一个抛出异常,或遇到其他问题吗?

请注意,根据MSDN,可以调用CreateDirectory()已存在的目录,在这种情况下,该方法不会执行任何操作.

Jar*_*Par 15

Directory.CreateDirectory调用本身是安全的从多个线程进行.如果这样做,它不会破坏程序或文件系统状态.

但是,不可能以Directory.CreateDirectory这种方式调用以保证它不会抛出异常.文件系统是一个不可预测的野兽,可以在任何给定时间由您控制之外的其他程序更改.例如,很可能看到以下情况发生

  • 方案1线程1:调用CreateDirectoryc:\temp\foo并且取得了成功
  • 程序2线程1:删除对c:\temp程序1用户的访问
  • 程序1线程2:CreateDirectory由于访问不足而致电和抛出

简而言之,您必须假定Directory.CreateDirectory,或者实际上任何接触文件系统的函数都可以并且将会相应地抛出和处理.


Chr*_*ain 6

目录上MSDN文档:

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的.任何实例成员都不保证是线程安全的.

因此,由于CreateDirectory是静态的,是的,它是线程安全的.

这就是说:正如@JaredPar指出的那样,线程安全问题并不是方法抛出异常的唯一原因.文件系统调用可能会抛出异常(在任何情况下,多线程或非多线程),并且您需要考虑这些原因,这有很多原因.

通过说它是线程安全的I(和MSDN)只暗示对它的字面解释,意思是"此方法不会以可能导致无效状态,竞争条件或通常与不安全相关的其他不利影响的方式修改共享程序状态多线程代码"