两个线程一个使用流 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的主要内容,如果未能解决你的问题,请参考以下文章