锁定文件创建的最佳方式(最佳性能)

时间:2014-06-18 09:42:06

标签: c# multithreading thread-safety

我有一个Web应用程序将图像返回到我的前端。 在这个应用程序中会发生什么:当对特定图像发出请求时,应用程序检查图像是否已存在于磁盘上;如果存在则返回图像。

当磁盘上不存在图像时,我的问题就开始了。在这种情况下,对于磁盘上不存在的同一图像,同时发出两个请求。当两个线程同时尝试在磁盘上创建相同的文件时,会出现问题。

要解决这个问题,我尝试做的是在创建磁盘映像时创建一个Mutex。但它有一个问题:由于大量的同时请求,服务器负载很大,服务器崩溃。

我想问一下你的想法是什么来解决这个问题。或者你会做什么呢?

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以尝试以下模式:

  1. 尝试阅读图像(如果成功,而不是完成)
  2. 尝试使用Write lock
  3. 创建图像
  4. 仅在"文件正在使用异常",小延迟(毫秒)
  5. 返回步骤1(重试)
  6. 使延迟非常小,只比创建图像所需的时间稍微大一点。 实施重试限制,最多3次左右。

    这将允许您使用现有的(文件)锁定机制

答案 1 :(得分:-1)

您可以使用openO_CREAT标记来调用O_EXCL函数。第一个进程的开放调用将获得创建文件的独占访问权限,它将开始下载映像。后续进程的公开调用将失败,因为它们的open不是独占的,而“errno”将被设置为EEXIST。

根据您的设计,后续流程可以等待完整的文件创建,也可以返回。

fd = open(path, O_CREAT|O_EXCL)