为什么可以';是否将易失性文件*分配给文件*? 我有一个Visual C++程序,它在一个线程中打开了一个文件:文件*fp= fOpen..(…)< />代码。我希望该线程在另一个线程读取文件时阻止一个事件对象,然后在完成时向被阻止的线程发出信号,然后关闭该文件。因为fp在线程之间共享,所以我将其声明为volatile FILE*fp。但是,fread()不会接受volatile作为其文件*参数。我尝试使用一个本地指针,带有FILE*fpLocal=fp,但这让我明白了这一点: Error: a value of type "volatile FILE*" cannot be assigned to an entity of type "FILE*"

为什么可以';是否将易失性文件*分配给文件*? 我有一个Visual C++程序,它在一个线程中打开了一个文件:文件*fp= fOpen..(…)< />代码。我希望该线程在另一个线程读取文件时阻止一个事件对象,然后在完成时向被阻止的线程发出信号,然后关闭该文件。因为fp在线程之间共享,所以我将其声明为volatile FILE*fp。但是,fread()不会接受volatile作为其文件*参数。我尝试使用一个本地指针,带有FILE*fpLocal=fp,但这让我明白了这一点: Error: a value of type "volatile FILE*" cannot be assigned to an entity of type "FILE*",c++,C++,当然,这让我担心,可能是我试图在一个线程中打开一个文件,然后在另一个线程中读取它,这是一个错误,尽管我还不明白为什么 有人能帮我吗?为什么我不能将易失性文件*分配给文件*?为什么我不能将易失性文件*分配给文件*? 因为C++有严格的类型检查,不能分配不匹配的类型。 如果是这种情况,则需要使用强制转换运算符,但需要注意的是,错误地使用它们也可能导致未定义的行为。 此行为与const限定符的行为相同 正如在评论中已经提到的,作为旁注,volatile不是这里的方法。为什么我不能将volatile文件

当然,这让我担心,可能是我试图在一个线程中打开一个文件,然后在另一个线程中读取它,这是一个错误,尽管我还不明白为什么


有人能帮我吗?为什么我不能将
易失性文件*
分配给
文件*

为什么我不能将
易失性文件*
分配给
文件*

因为C++有严格的类型检查,不能分配不匹配的类型。 如果是这种情况,则需要使用强制转换运算符,但需要注意的是,错误地使用它们也可能导致未定义的行为。
此行为与

const
限定符的行为相同


正如在评论中已经提到的,作为旁注,
volatile
不是这里的方法。

为什么我不能将
volatile文件*
分配给
文件*

因为C++有严格的类型检查,不能分配不匹配的类型。 如果是这种情况,则需要使用强制转换运算符,但需要注意的是,错误地使用它们也可能导致未定义的行为。
此行为与

const
限定符的行为相同



正如评论中已经提到的,作为旁注,
volatile
不是这里的方法。

删除
volatile
。它与线程无关。您不能将
易失性文件*
分配给
文件*
,原因与您不能将
常量文件*
分配给
文件*
相同,但如@R.MartinhoFernandes所述,在这里使用
volatile
一开始是非常错误的。唯一的
volatile
保证的是每次访问
volatile
变量都会导致加载/存储(顺便说一句,这对于将内存映射到I/O设备之类的系统来说很有用。例如,C标准甚至一次都没有提到“线程”这个词。)请注意,此上下文中的
volatile
应用于指针,而不是文件对象本身。即使它做了您想要的事情,也没有太大帮助,事实并非如此。@Stevens-它也不能保证其他CPU看到更改。它们可能有单独的缓存。我们不知道线程在哪里运行。删除
volatile
。它与线程无关。你不能将
易失性文件*
分配给
文件*
,原因与你不能将
常量文件*
分配给
文件*
的原因相同,但正如@R.MartinhoFernandes所指出的,在这里使用
易失性
是非常错误的。唯一的一点是
易失性
保证每次访问
volatile
变量都会导致加载/存储(当然,这对于将内存映射到I/O设备等的系统很有用。例如,C标准甚至一次都没有提到“线程”一词)请注意,此上下文中的
volatile
应用于指针,而不是文件对象本身。即使它做了您想要的事情,也没有太大帮助,事实并非如此。@Stevens-它也不能保证其他CPU看到更改。它们可能有单独的缓存。我们不知道线程在哪里运行。删除volatile会导致一切都很简单,但现在我必须问为什么这是安全的。我认为volatile是防止一个线程更改另一个线程可能读取的缓存值的方法。这是我从MSDN中收集的信息,其中说,volatile关键字是一个类型限定符,用于声明某个对象可以在程序中被操作系统、硬件或并发执行线程等修改。“@StevensMiller不提供任何排序、原子性或可见性保证。这只意味着编译器无法通过假设值不变来进行某些优化。@StevensMiller:这应该让您开始:@Stevens:在VC++,
volatile
意味着原子性和内存障碍(至少从VC++2003开始),但这只是一个扩展(甚至文档也注明“特定于Microsoft”)对于标准C++,它并不是每个人都在谈论的。“史蒂文斯米勒:抱歉延迟响应。我有点被赶了起来。”从答案<代码>引用“Value”确实保证了变量不是被缓存的,而是实际上被修改的,但是它不提供重新排序保证。你需要的是一个内存。y屏障和大多数同步构造隐式地提供了内存屏障。一个简单的互斥体或信号量应该可以很好地为您服务。删除volatile会让一切变得容易,但现在我必须问一下为什么这是安全的。我认为volatile是防止一个线程更改另一个线程可能读取的缓存值的方法。这就是我所说的从MSDN中可以看出,“volatile关键字是一个类型限定符,用于声明一个对象可以在程序中被操作系统、硬件或并发执行线程等修改。”@StevensMiller,它不提供任何排序、原子性或可见性保证。它只意味着编译器无法通过假设值不变来进行某些优化。@StevensMiller:这应该让您开始:@Stevens:在VC++,
volatile