线程间的同步概述(二)
rue;
}
return false;
}
再运行上面的程序,选中“自动判断”,程序将很快不停的运行,但很快将又停下来,运行结果如下图所示,有可能你的结果和我的不一样,但类型差不多的。
现在你发现问题了吗?对了,报数出现相同数了(见上图出现两个“2”)。
你可能要问,怎么会这样呢?
这就是多线程最容易出现的问题,也是多线程
编程的难点和核心。再说说上面程序,创建了9个线程,这9个线程是同时运行的(即并行运行),它们都要修改变量全局g_nCount(g_nCount++;),就有可能两个或多个线程同时读取到g_nCount,而当前的g_nCount已经被其它线程修改,即输出的不是线程当前的值。这和单线程的顺序执行是有很大不同的。
那有什么方法解决上面的问题吗?当然有,这就是在江湖中大名鼎鼎的线程同步技术,而且
系统提供了多种线程同步的技术/方法。
2.什么是同步
“同步”不是指平常所说的两件事情同时进行。它的目的是使多个线程之间协调工作,而且常常是避免两个线程同时进行某些操作,比如同时访问同一个共享资源。一般来说,同步是通过暂时将会发生冲突操作的某个线程暂停执行(称为阻塞线程),然后等待不会冲突时再继续执行。
3.需要同步的情况
3.1、多个线程同时访问同一对象时
MFC对象在对象级不是线程安全的,只有在类级才是。如:两个线程可以安全地使用两个不同的CString对象,但同时使用同一个CString对象就可能产生问题。如果必须使用同一个对象,那么应该采取适当的同步化措施。
3.2、多个线程之间需要协调运行
例如,如果第二个线程需要等待第一个线程完成到某一步时才能运行,那么该线程应该暂时挂起以减少对CPU的占用时间,提高程序的执行效率。当第一个线程完成了相应的步骤后,应该发出某种信号来激活第二个线程。
4.Windows中的4种线程同步技术
4.1、Events(事件)——CEvent
作为标志在线程之间传递信号。简单地说,类似一个布尔型变量的开关作用。
4.2、Critical Sections(临界段)——CCriticalSection
在进程中作为关键字以获得对共享资源的访问
4.3、Mutexes(互斥量)——CMutex
与临界段的工作方式相似,只是该对象可以用于多进程中的线程同步,而不是用于单进程中
4.4、Semaphores(信号量)——CSemaphore
在给定的限制条件下,允许多个进程同时访问共享资源