关于 volatile ,进来看看

szn_409 2016-03-03 07:46:06
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <process.h>

volatile int Value0 = 0;

unsigned int _stdcall ThdFun0(void* param)
{
int Count = 0;
while(1)
{
++Count;
++Value0;
if (Value0 > 1e8)
{
break;
}
}
printf("Thd End Count = %d\n", Count);
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread0 = (HANDLE)_beginthreadex(NULL, 0, ThdFun0, NULL, 0, NULL);
HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThdFun0, NULL, 0, NULL);

WaitForSingleObject(hThread0, INFINITE);
WaitForSingleObject(hThread1, INFINITE);

char ch = getchar();

return 0;
}

如上代码,为什么两次输出值之和远大于1e8,接近2e8
...全文
119 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2016-03-04
  • 打赏
  • 举报
回复
volatile修饰的变量,只是保证一个线程修改后,其余的线程访问时能,马上得到修改后的值(也就是能立刻感知到)。如果没有volatile修饰,编译器优化的时候,很可能只是读取修改前的内存数据,不能立刻读取到改变后的值。
paschen 2016-03-04
  • 打赏
  • 举报
回复
volatile不是用来保证线程安全的,要保证线程安全得自己加锁
赵4老师 2016-03-04
  • 打赏
  • 举报
回复
《Windows核心编程》
iyomumx 2016-03-03
  • 打赏
  • 举报
回复
volatile并不保证线程安全

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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