浅谈线程同步 (二)

2014-11-24 03:18:28 · 作者: · 浏览: 1
\n", szSharedBuffer);
SetEvent(hEvent);
}
return 0;
}

当然这里只是对线程同步进行一个简单的说明,真正要掌握线程同步比这里所写的要复杂的多。这将在以后的学习中

慢慢补充。


补充:

在上面这个例子中,创建事件对象时,第二个参数我设置的是FALSE,也就是说将事件自动重置。后来我自己改用

设置为TRUE,结果出了问题。后来想起来设置为TRUE的话,需要我们手动设置。于是在WaitForSingleObject函数

后面加了ResetEvent函数。本以为这样就可以解决问题了,但还是有问题。后来在网上问了下别人也找了点书看才知

道了原因。


这种做法存在两个问题,一个问题是,在单CPU平台下,同一时刻只能有一个线程在运行,假设线程ThreadForWrite

先执行,它得到事件对象:hEvent,但是如果正好这时它的时间片终止了,于是轮到线程ThreadForRead执行,但因

为现在在线程ThreadForWrite中,ResetEvent函数还没有被执行,所以该事件对象仍然处于“标志的”状态,因此线程

ThreadForRead就可以得到该事件对象,也就是说,此时两个线程都可以访问共享资源,于是结果就无法预料了。


第二个问题,当把这段程序移植到多CPU平台上时,两个线程就可以同时运行,这时再主函数里调用SetEvent函数将

其设置为”标志的“状态已经没多大意义了,因为这两个线程都已经可以访问共享资源了,而且是同时使用。


看来以后实现线程同步时还是老实点使用自动重置的事件对象。