[英]Is CreateDirectory() in C# thread-safe?
我可以安全地尝试从两个不同的线程创建相同的目录,而不会让其中一个抛出异常,或遇到其他问题吗?
请注意,根据MSDN ,可以在已存在的目录上调用CreateDirectory()
,在这种情况下,该方法不会执行任何操作。
Directory.CreateDirectory
调用本身可以安全地从多个线程进行。 如果这样做,它不会破坏程序或文件系统状态。
但是,无法以这种方式调用Directory.CreateDirectory
以保证它不会抛出异常。 文件系统是一个不可预测的野兽,可以在任何给定时间由您控制之外的其他程序更改。 例如,很可能看到以下情况发生
c:\\temp\\foo
调用CreateDirectory
并成功 c:\\temp
访问权限 CreateDirectory
并因访问不足而抛出 简而言之,您必须假设Directory.CreateDirectory
,或者实际上任何触及文件系统的函数都可以并且将相应地抛出和处理。
要详细说明@JaredPar的答案,你手上就有竞争条件。 如果第一个呼叫完全创建了文件夹,只有第二个呼叫开始,一切都会正常。
但是,如果第二个呼叫在仍处理第一个呼叫时到达操作系统,则操作系统可能会使第二个呼叫失败以锁定问题,并且您将获得异常。
它仍然是线程安全的,因为您不会创建任何不可预测的文件夹,或根本没有文件夹。
详细说明 - 虽然我并非100%确定Windows在同时创建两个同一文件夹时没有内部竞争条件,但我很确定你无法通过这样做来废弃磁盘,或者两个创作都陷入死亡之中陷入僵局。 其中一个会成功,另一个会失败,但会创建文件夹。
所以你的启发式,只是为了绝对肯定,应该是这样的:
如果它经常失败(例如,连续3次),你手上还有另一个问题 - 对文件夹,完整磁盘等没有权限。
顺便提一下,为什么不在应用程序开始运行时创建文件夹?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.