关于多线程:
1. C++中,创建线程有SDK的CreateThread,传递一个线程函数,它的定义为
DWORD
WINAPI funcproc(LPVOID lpParameter)。但我们尽量避免使用单纯的C++库,在VC++中
MFC封装了CWinThread,我们既可以从CWinThread派生
出自己的线程类,也可以直接使用CWinThread作为宿主类,传递线程函数。线程函数的定义为UINT ThreadProc(LPVOID
lpParam),我们使用AfxBeginThread来创建一个线程,该线程一旦启动后,将直接进入ThreadProc,而且从该
ThreadProc返回时,线程也将结束。我们设置dwCreateFlags参数的值为CREATE_SUSPENDED来使线程一创建后,直接挂
起。我们也可以显式调用AfxEndThread来结束线程。
- 在多线程开发中,最主要的麻烦是同步和资源冲突问题,我们考虑以下环境,有线程读取一个变量,而另一个线程正在同步刷新该变量,这时
就发生同步问题。面对一个资源,我们有时需要限制同时访问该资源的个数。我们有时只能允许只有一个线程访问一个资源,例如打印机。我们还有些时候需要让线
程等待一个信号的出现,例如串口采集后台处理线程。
- CEvent:表示一个“事件”——一个允许一个线程通知另一个线程事件已经发生的同步对象。当应用程序必须等到发生某事才能访问资源的时候,我们应该使用这个类。
在一个处理线程中,用CEvent::SetEvent,然后其他类使用CSingleLock::Lock等待。
- CSemaphore:表示一个“信号灯”——一个允许一个或多个进程中的有限多个线程访问一个资源的同步对象。当限制同一应用程序内(1到n个)线程可以同时访问此资源时,我们应该使用这个类。
CSemaphore
semaphore(3,3,”semaphore”);//参数1:初始资源数;2:最大资源数;3:信号量的名称.
semaphore.Lock();
semaphore.Unlock();
若已经达到最大访问客户数,则下一个请求锁定客户将会阻塞等待。
- CMutex:表示一个“互斥体”——一个允许一个线程以互相排斥的方式访问一个资源的同步对象。当可以有一个以上的应用程序使用此资源,使用这个类。
CMutex
mutex(FALSE,”MUTEX”);//第一个参数:互斥量初始是锁定还是未锁定;第二个参数:互斥量名称,用于标识.
mutex.Lock();
mutex.Unlock();
- CCriticalSection:表示一个“临界区”——一个允许一个线程同时访问一个资源或代码段的同步对象。相对与CMutex,则使用这个类,与上面的区别唯一在于上面可以允许另一个进程使用该资源,两者相同在于进程内线程互斥。
- CMultiLock:表示多线程程序中用于控制对多个资源的访问的访问控制机制。若其中有一个资源没释放,则等待。
- CSingleLock:表示多线程程序中用于控制对一个资源的访问的访问控制机制。CSingleLock
singleLock(&m_CritSection);
singleLock.Lock();
singleLock.Unlock();
m_CritSection为同步类,根据不同的需要采用不同的同步类,如CEvent、CMutex、CCriticalSection。