两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
Two threads one uses stream Api and other thread CreateFile fails with error ERROR_SHARING_VIOLATION
在我目前的工作中,我们有几个线程同时运行, 通过其中一个线程,我们打开了一个文件:
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。
任何输入都是可观的。
您的CreateFile()
调用将dwShareMode
参数设置为 0,因此它正在尝试打开文件进行独占访问,如果文件已打开,这将失败。
您需要指定与ofstream
打开文件的方式兼容的共享权限,例如:
HANDLE handle = CreateFileW(filename.c_str(), GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- C++为线程工作动态地分割例程
- 从c#中的线程调用c++函数时发生system.access.violation异常