事件对象跟全局变量的区别
事件对象和全局变量的区别
不太了解事件对象的优势在哪里。
我随意敲点代码示意:
// 情况一:使用 事件对象来操作:************************************************
// 情况二:使用全局变量来操作:*******************************************************
问题:
我在第二种情况中,模拟事件对象来驱动线程操作,只是使用一个全局变量而已。
那么,事件对象的优势到底在哪里?
鄙人浅薄,请各位不吝赐教。谢谢!
------解决方案--------------------
全局变量操作不是原子操作,event是可以保证原子操作的。
原理上全局变量是会出现多个线程同时进入的情况的。
------解决方案--------------------
1)事件,可以同步;
全局变量,只能用于指示状态;
不具有线程同步功能。
即使是BOOL,也不是一条指令,就改变的。
2)全局变量,代码是全速运行,循环检查状态,属于忙等待;
CPU处于空忙状态,没有做任何事情,但是一直在忙。
事件锁住以后,线程挂起,不在执行代码。
属于空闲等待。在此期间,其它线程可以做任何事,不受等待线程的影响。
忙等待一直占用CPU;
空闲等待,只有等待时候,不占用CPU。
全局变量,需要循环检测,所以一直在运行;
响应速度快,但是由于空忙,效率太低。
事件挂起线程,需要线程切换,才能重新执行,响应速度慢;
但是,由于,不占用CPU时间,可以给其他,需要CPU的线程,让出CPU;
CPU利用率高,所以代码效率高。
不太了解事件对象的优势在哪里。
我随意敲点代码示意:
// 情况一:使用 事件对象来操作:************************************************
HEVENT hEvent = CreateEven(NULL, FALSE, FALSE, NULL);
.....
// 在线程里头:
while(true)
{
WaitForSingleObject(hEvent, INFINIT);
// 进行我的处理
.......
}
.....
//在响应某消息 WM_XXX中:
SetEvent(hEvent);
// 情况二:使用全局变量来操作:*******************************************************
BOOL g_bFlag = FALSE;
.......
// 线程中:
while(true)
{
if(g_bFlag)
{
g_bFlag = FALSE;
// 进行我的处理
.....
}
else
Sleep(10);
}
.....
// 响应某消息中:
g_bFlag = TRUE;
问题:
我在第二种情况中,模拟事件对象来驱动线程操作,只是使用一个全局变量而已。
那么,事件对象的优势到底在哪里?
鄙人浅薄,请各位不吝赐教。谢谢!
------解决方案--------------------
全局变量操作不是原子操作,event是可以保证原子操作的。
原理上全局变量是会出现多个线程同时进入的情况的。
------解决方案--------------------
1)事件,可以同步;
全局变量,只能用于指示状态;
不具有线程同步功能。
即使是BOOL,也不是一条指令,就改变的。
2)全局变量,代码是全速运行,循环检查状态,属于忙等待;
CPU处于空忙状态,没有做任何事情,但是一直在忙。
事件锁住以后,线程挂起,不在执行代码。
属于空闲等待。在此期间,其它线程可以做任何事,不受等待线程的影响。
忙等待一直占用CPU;
空闲等待,只有等待时候,不占用CPU。
全局变量,需要循环检测,所以一直在运行;
响应速度快,但是由于空忙,效率太低。
事件挂起线程,需要线程切换,才能重新执行,响应速度慢;
但是,由于,不占用CPU时间,可以给其他,需要CPU的线程,让出CPU;
CPU利用率高,所以代码效率高。