volatile 问题

LQS@LY 2015-10-17 06:26:30
加精
我用volatile修饰一个CString数组
volatile CString s[20];
然后
S[0] = “东东不死传说";
就报错这是为什么?error C2678: binary '=' : no operator defined which takes a left-hand operand of type 'volatile class CString' (or there is no acceptable conversion)
我用volatile修饰一个double
volatile double temp[20];
temp[0] = 1.11;
这个却不报错这是为啥
...全文
1010 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2015-10-27
  • 打赏
  • 举报
回复
volatile 一般是防止编译器把一个变量优化成寄存器变量等 而一个字符串是不可能被优化成寄存器变量的, 只有它的指针可能, 内容是办不到的. 而CString本身内部的字符串指针又是随时会改变的. 所以加这个根本没有意思意义. 在多线程同步中, 如果只是数值类型的变量如( int , BYTE等等基本数据类型), 就用这个volatile就行. 如果是其它的, 比如类, 结构体,数组这些类型的访问, 就需要加锁, 可以使用"临界区", "信号量" ,"事件"等等机制来实现加锁同步.
worldy 2015-10-25
  • 打赏
  • 举报
回复
引用 10 楼 a18711839961 的回复:
[quote=引用 6 楼 xiaohuh421 的回复:] [quote=引用 5 楼 a18711839961 的回复:] [quote=引用 4 楼 schlafenhamster 的回复:] volatile 只是 防止 编译器对代码 的 优化
我就是为了防止编译器优化,因为我另外一个进程会用到这个数组[/quote] 看这里就已经悲剧了. 进程间通信, 由于地址空间不同, 你根本就不能直接访问. 估计你说的是线程, 线程间共享就不用管这个东西了, 只要对这个数组的读写加锁就行了.[/quote] 不好意思打错字了,是线程,我另外一个线程会用到这个数组,我想用volatile修饰这个数组,防止它被编译器优化,我新手啊, 因为这个数组里面的数据在另一个进程中会不断的变化,我在这个线程里用一个定时器1S读一次这个数组就可以了,这样我需不需要用volatile 修饰呀,我把它去掉虽然不报错了,但是我想把这个问题搞清楚呀 [/quote] 不需要使用修饰符,volatile只是防止一些初始化操作被编译器优化,而不是用于数据同步,lz你这个需求必须使用数据锁进行同步
schlafenhamster 2015-10-24
  • 打赏
  • 举报
回复
volatile 修饰 CString 是没有定义的 ,你 自己建个 volatile class 看看能不能 成。
LQS@LY 2015-10-24
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
volatile 修饰 CString 是没有定义的 ,你 自己建个 volatile class 看看能不能 成。
谢谢
LQS@LY 2015-10-24
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
EnterCriticalSection The EnterCriticalSection function waits for ownership of the specified critical section object. The function returns when the calling thread is granted ownership. VOID EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection // pointer to critical // section object ); 等等。。。。。
互斥变量,我先看看,我新手啊,但是那个为什么报错啊,我还是不明白
cs1438250 2015-10-23
  • 打赏
  • 举报
回复
这个格斗游戏玩过,挺有意思的。。
schlafenhamster 2015-10-23
  • 打赏
  • 举报
回复
EnterCriticalSection The EnterCriticalSection function waits for ownership of the specified critical section object. The function returns when the calling thread is granted ownership. VOID EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection // pointer to critical // section object ); 等等。。。。。
LQS@LY 2015-10-23
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
“只要对这个数组的读写加锁就行了” 与 volatile 无关,
数组加锁是什么意思,我新手不懂啊,我网上查不到啊,具体怎么做啊,还有那个double型的数组我用volatile 修饰可以不?我在另外一个线程中也去要用到这个数组
schlafenhamster 2015-10-23
  • 打赏
  • 举报
回复
“只要对这个数组的读写加锁就行了” 与 volatile 无关,
LQS@LY 2015-10-23
  • 打赏
  • 举报
回复
引用 6 楼 xiaohuh421 的回复:
[quote=引用 5 楼 a18711839961 的回复:] [quote=引用 4 楼 schlafenhamster 的回复:] volatile 只是 防止 编译器对代码 的 优化
我就是为了防止编译器优化,因为我另外一个进程会用到这个数组[/quote] 看这里就已经悲剧了. 进程间通信, 由于地址空间不同, 你根本就不能直接访问. 估计你说的是线程, 线程间共享就不用管这个东西了, 只要对这个数组的读写加锁就行了.[/quote] 不好意思打错字了,是线程,我另外一个线程会用到这个数组,我想用volatile修饰这个数组,防止它被编译器优化,我新手啊, 因为这个数组里面的数据在另一个进程中会不断的变化,我在这个线程里用一个定时器1S读一次这个数组就可以了,这样我需不需要用volatile 修饰呀,我把它去掉虽然不报错了,但是我想把这个问题搞清楚呀
tiger波波 2015-10-22
  • 打赏
  • 举报
回复
引用 5 楼 a18711839961 的回复:
[quote=引用 4 楼 schlafenhamster 的回复:] volatile 只是 防止 编译器对代码 的 优化
我就是为了防止编译器优化,因为我另外一个进程会用到这个数组[/quote] 你进程通信用的什么方式?? 另外可以把volatile去掉试试,能不能达到预期效果。就算达不到预期效果也不是volatile能解决的,应该使用进程同步。
xiaohuh421 2015-10-21
  • 打赏
  • 举报
回复
引用 5 楼 a18711839961 的回复:
[quote=引用 4 楼 schlafenhamster 的回复:] volatile 只是 防止 编译器对代码 的 优化
我就是为了防止编译器优化,因为我另外一个进程会用到这个数组[/quote] 看这里就已经悲剧了. 进程间通信, 由于地址空间不同, 你根本就不能直接访问. 估计你说的是线程, 线程间共享就不用管这个东西了, 只要对这个数组的读写加锁就行了.
schlafenhamster 2015-10-21
  • 打赏
  • 举报
回复
volatile 意思是 随时 可以 变的, 如中断中被改变。
schlafenhamster 2015-10-20
  • 打赏
  • 举报
回复
volatile 只是 防止 编译器对代码 的 优化
LQS@LY 2015-10-20
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
volatile 只是 防止 编译器对代码 的 优化
我就是为了防止编译器优化,因为我另外一个进程会用到这个数组
schlafenhamster 2015-10-19
  • 打赏
  • 举报
回复
volatile char* s[20]; s[0] = "东东不死传说";
信阳毛尖 2015-10-19
  • 打赏
  • 举报
回复
字符串用volatile修饰是没有意义的,出现这个错误是很明显的,因为没有哪个字符串类有类似接受 volatile char* 参数的相关函数。再一个个人以为字符串及数组本身就应该具有volatile属性,编译器是不会对这些进行优化的 理论上你可以这么写,编译会通过的(跟const关键字很类似):

volatile CString s[20] = {_T("东东不死传说"),0};
之后对s的所有值修改操作,都是编译不过的!
RLib 2015-10-19
  • 打赏
  • 举报
回复
你的volatile是想修饰CString还是修饰s?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧