两个线程一个使用流 Api,另一个线程 CreateFile 失败并出现错误 ERROR_SHARING_VIOLATION

Posted

技术标签:

【中文标题】两个线程一个使用流 Api,另一个线程 CreateFile 失败并出现错误 ERROR_SHARING_VIOLATION【英文标题】:Two threads one uses stream Api and other thread CreateFile fails with error ERROR_SHARING_VIOLATION 【发布时间】:2020-06-05 03:32:14 【问题描述】:

在我目前的工作中,我们有几个线程同时运行, 通过其中一个线程,我们打开了一个文件:

std::ofstream fs;    
fs.open(filename.c_str(), std::ofstream::out);
if( fs.is_open() )
   // do some file operation and write
   fs.close();

同时一个单独的线程也访问同一个文件:

HANDLE handle = CreateFileW(filename.c_str(), GENERIC_READ,0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

它失败并给出错误 ERROR_SHARING_VIOLATION。

我知道,我们可以使用同步机制来解决这个问题,

但是我们可以在打开文件时使用文件共享机制来处理它吗,因为一个线程使用流API打开文件,而其他线程使用createFile。

任何输入都是可观的。

【问题讨论】:

如果读线程在写线程写的同时读,你想发生什么? 该问题与您的并发使用无关。如果一切都在单个线程上实现,您将观察到相同的行为。可能想要更新此问题以删除不相关的信息,并生成 minimal reproducible example。这实际上是 3 行代码,包括错误处理。 嗨,@user9055801,答案是否解决了您的问题?如果有帮助,请随时accept。 【参考方案1】:

您的CreateFile() 调用将dwShareMode 参数设置为0,因此它正尝试以独占访问权限打开文件,如果文件已经打开,则会失败。

您需要指定与ofstream打开文件的方式兼容的共享权限,例如:

HANDLE handle = CreateFileW(filename.c_str(), GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

【讨论】:

以上是关于两个线程一个使用流 Api,另一个线程 CreateFile 失败并出现错误 ERROR_SHARING_VIOLATION的主要内容,如果未能解决你的问题,请参考以下文章

java.io.PipedInputStream

C# - 将数据写入流 + 使用另一个流读取数据

Java多线程-管道流实现线程间通信

多线程文件压缩

QT环境下,<POSIX多线程>全局变量共享问题

Java基础——iO