Win32下两种用于C++的线程同步类(下)

Win32下两种用于C++的线程同步类(下),第1张

Win32下两种用于C++的线程同步类(下),第2张

在上一篇文章中,我介绍了一种通过关闭临界区对象来使用互斥体的简便方法。本文所有的例子都是两个线程读写相同的数据,所以这里需要互斥,不能同时访问。在实际情况中,可能会出现更复杂的情况,即多个线程访问同一个数据,有些是读的,有些是写的。我们知道只有同时进行读-写或者写-写时才可能出现问题,而读-读可以同时进行,因为它们不会修改数据,所以也需要在C++中封装一个方便的锁,允许读写并发、读写互斥。要实现这种锁,很难使用临界区。相反,使用内核对象。这里我使用互斥。

的整体结构类似于上一篇文章中的结构。就是写一个封装锁的基类,然后写一个调用添加和解锁函数的类,通过管理第二个类的生命周期来实现加锁和解锁。这里涉及到两个新问题。一、加锁和解锁动作有两种,一种是加锁/解码,一种是加锁/解锁;第二,为了允许读-读并发,这里只声明一个互斥体是不够的。必须声明多个互斥体,并且有多少互斥体,就允许同时并发多少读线程。这是因为我们想要使用的API函数是WaitForMultipleObjects。

WaitForMultipleObjects的作用是等待对象状态被设置,在MSDN对它的描述是:
等待直到一个或所有指定的对象处于有信号状态或超时间隔弹性。
这是一个非常有用的函数。我们可以用它来等待一个或几个对象,并允许设置超时。成功等待时返回的值与超时时返回的值不同。如果返回值小于WAIT _ ancested,则表示等待成功。“等待成功”对于不同类型的内核对象有不同的含义。比如对于进程或线程对象,等待成功意味着进程或线程执行结束;对于互斥体对象,意味着该对象现在不被任何其他线程拥有,一旦等待成功,当前线程将拥有互斥体,而其他线程不能同时拥有。直接调用ReleaseMutex函数主动释放互斥体。

与waitformulipleobjects类似的还有一个函数WaitForSingleObject,它的函数比较简单,只针对单个对象,而waitformulipleobjects可以同时WaitForMultipleObjects,可以设置是否等待所有对象。

上一篇文章中使用的InstanceLockBase类封装了一个临界区对象,这里要封装一组互斥体的句柄。那么这一套有多少呢?它应该由使用这个类的程序来定义。例如,可以使用动态数组的方法:

//基类:
class RWLockBase //表示读/写锁
...{
handle * handles;
protected:
RWLockBase(int handle count)...{ handles =新句柄[HANDLE count];}

};
//子类:
class my class:public rwlockbase
...{
my class (): rwlockbase (3)...{}
...
};

这确实是一个好办法。通过调用基类构造函数并在子类构造函数的初始化部分传递参数,可以正确初始化这个动态数组。然而,它看起来并不好。子类必须有单词“RWLockBase”两次。可以像InstanceLockBase一样直接继承吗?答案是肯定的,使用C++模板即可:

模板
类RWLockBase
...{
HANDLE句柄[maxReadCount];

};

使用模板有这样一个好处,因为模板的参数可以在编译时确定,所以不需要使用动态数组,可以直接在栈上分配。但是模板的使用导致了一个新的问题,就是构造时间传递的对象指针时对应锁类(RWLock)的类型声明。直接写成RWLock(RWLockBase* pObj)是肯定不行的,因为必须指定模板参数,并且它们的值必须与声明RWLockBase时指定的值一致,所以客户端代码必须指定两次模板参数值。不开心!还有一个解决方案,就是把RWLockBase变成一个夹层类,为它声明另一个基类,让RWLock接收基类的指针,把Lock、Unlock等函数放在基类里,声明为纯虚函数,在夹层类里写实现:

class _RWLockBase
...{
友元类RWLock
protected:
virtual DWORD read lock(int time out)= 0;
virtual void read unlock(int handle index)= 0;
虚拟DWORD write lock(int time out)= 0;
virtual void write unlock()= 0;
};

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Win32下两种用于C++的线程同步类(下)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情