C语言线程关闭会释放自动释放,C语言 怎么才能在线程结束让该线程申请的信号不会自动释放?...

匿名用户

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值