匿名用户
1级
2011-11-29 回答
Windows中可以用于同步/互斥的对象很多:Mutex、Semaphore、CriticalSection、Event、Waitable Timer,还有其他很多Handler(Process Handler, Thread Handler)。其中Mutex、Semaphore、CriticalSection都是有OwnerShip关系的,既只能由获取信号量的人释放。
不知道你使用的场景。如果是生产者和消费者,那么可以使用Event。生产者SetEvent,消费者WaitEvent。
追问:
用在 读写操作 的那个算法。 无法把ownership传给别的线程或者给主线程吗?
追答:
前面说错了,Semaphore是没有OwnerShip的。
对于读写问题,简单的实现需要两个信号量。下面是一个从网上拷贝的算法。
需要注意的是,在Windows中,WriteLock用Semaphore信号量(允许一个读线程获取,其他写线程释放),用于互斥读写。ReadLock可以用Mutex或者CriticalSection。
读写锁的数据结构:
typedef struct RWLOCK_st{
LOCK ReadLock;
LOCK WriteLock;
UINT uReadcount;
}RWLOCK;
//读操作保护的伪代码
RWLock_LockRead()
{
上锁锁住计数器变量的读写
计数器加 1
if(计数器的值为 1)
{
上锁写住写操作
}
解锁计数器变量的读写
}
RWLock_UnlockRead()
{
上锁锁住计数器变量的读写
计数器减 1
if(计数器的值为 0)
{
解锁写操作
}
解锁计数器变量的读写
}
//写操作保护的伪代码
RWLock_LockWrite()
{
上锁锁住写操作
}
RWLock_UnlockWrite()
{
解锁写操作
}
参考资料:http://blog.csdn.net/guofengzai/article/details/4891727