解决方案 »
- MFC ADO连接Access用户管理添加新用户,RecordSet返回-1的问题
- vc开发NPAPI
- MFC程序使用MPI,如何运行?
- vc++定义数组问题
- 请问 msn 聊天的窗口 是否是非模态的对话框,我用wtl做了开发了一个程序,弹出一个非模态对话框后 用alt+tab 无法看到这个对话框
- dll调用问题,知道的话应该很简单.
- windows提示有无效页是怎么回事?
- 一个数学难题:全用正版该付银子几何?
- 推荐:高音质的语音通话程序! uaiia.d2g.com
- 求购二手书籍:《Windows核心编程》、《Windows游戏编程大师技巧》(第二版)中文版
- 基于对话框的打印预览界面打印报错
- DoModal问题
这跟Sleep(1)没有关系,加Sleep(1)的原因是我的应用是在游戏程序中,不加Sleep会把CPU耗光。
我的这种方式主要是为了解决数据冲突问题。我认为,没有哪种方式比这个更快。是0等待。
我的游戏在每一帧都要渲染一张图片,这张图片在创建之初,就一直出于渲染状态(有个变量记录是否已加载完,加载完才会渲染)。
而线程则后台对图片的像素进行加载,加载完后,则标记加载完的状态。
为了两者不冲突,我加入了这种线程同步方式,这种方式是某个朋友提出来的,我发现他相当的strong,不仅不存在冲突问题,而且是0等待。
另外,跟Sleep没有关系,是我一开始没把要解决的问题阐述清楚。
你根本保证不了。你知道所谓“CPU写入存储”,或者叫“合并写入”的机制吗?
你根本不想去了解。对IA32体系结构而言,有合并写入的设计。当一个写入操作被CPU提交至总线的时候(即要求总线将值写入相应的内存),如果总线忙,则将这个操作计入Write Store里,等待总线空闲的时候,总线将Store中的所有写入操作一并完成。这就是“合并写入”,会导致写入操作延迟。有几种情况将强制将Store中写入操作flush到内存,其中一种就是有lock指令前缀被执行的时候,将强制导致Store刷新。这就是为什么在这种内存同步的时候(栅栏指令也会导致Store刷新,所以仅使用栅栏指令时不必要使用lock)要使用lock类前缀操作(在windows里就是Interlocked系列函数)。
{
// do something
a = 1; // 我加的代码
g_Open = TRUE;
Sleep(1);
}假如你的本意是用g_Open变量的真假值来保护变量a的存取一致性,而其实,在两方面,你都难以达到目的:1. 优化器会打乱代码的顺序,比如,上面的代码,编译完之后可能会等价于下面的代码: a = 1;
g_Open = TRUE; 优化器生成的代码可能会等价于:
g_Open = TRUE;
a = 1; 所以,你根本无法这样保护变量a。2 IA32的CPU指令优化:即使优化器是按照你想要的顺序生成代码,一旦代码在IA32的CPU里执行,CPU也会调整指令的执行顺序。有的读操作会被提前到写操作之前。比如:
mov a, eax // 写操作
mov ebx, b // 读操作 可能会被CPU优化为等价代码: mov ebx, b // 读操作
mov a, eax // 写操作
哦,对,这个我没有写好,我原来的程序结构是这样的:线程函数()
{
while (true)
{
调用函数()
{
if (g_Open == FALSE)
{
....
}
}
Sleep(1)
}
}然后主线程也是如此的,我的这个子线程就是帮主线程在后台加载数据。。