SetEvent(hEvent);
}
return 0;
}
当然这里只是对线程同步进行一个简单的说明,真正要掌握线程同步比这里所写的要复杂的多。这将在以后的学习中
慢慢补充。
补充:
在上面这个例子中,创建事件对象时,第二个参数我设置的是FALSE,也就是说将事件自动重置。后来我自己改用
设置为TRUE,结果出了问题。后来想起来设置为TRUE的话,需要我们手动设置。于是在WaitForSingleObject函数
后面加了ResetEvent函数。本以为这样就可以解决问题了,但还是有问题。后来在网上问了下别人也找了点书看才知
道了原因。
这种做法存在两个问题,一个问题是,在单CPU平台下,同一时刻只能有一个线程在运行,假设线程ThreadForWrite
先执行,它得到事件对象:hEvent,但是如果正好这时它的时间片终止了,于是轮到线程ThreadForRead执行,但因
为现在在线程ThreadForWrite中,ResetEvent函数还没有被执行,所以该事件对象仍然处于“标志的”状态,因此线程
ThreadForRead就可以得到该事件对象,也就是说,此时两个线程都可以访问共享资源,于是结果就无法预料了。
第二个问题,当把这段程序移植到多CPU平台上时,两个线程就可以同时运行,这时再主函数里调用SetEvent函数将
其设置为”标志的“状态已经没多大意义了,因为这两个线程都已经可以访问共享资源了,而且是同时使用。
看来以后实现线程同步时还是老实点使用自动重置的事件对象。