一个很简单的读写锁模型,请高手帮忙看上会不会死锁,或者有哪些需要改进的地方
一个很简单的读写锁模型,请高手帮忙看下会不会死锁,或者有哪些需要改进的地方?
cs为临界段,inc和dec为线程安全的累加和累减,readers为读者数。
读者:
{
cs.lock();
inc(readers);
cs.unlock();
任务代码;
dec(readers);
}
写者:
{
cs.lock();
while (readers > 0)
{
Sleep(1);
}
任务代码;
cs.unlock();
}
1.有发生死锁的可能吗?
2.Sleep(1)那个地方觉得不太好,有什么更好的办法吗?这样改进行不行?
event为手动事件。
读者:
{
cs.lock();
inc(readers);
cs.unlock();
任务代码;
dec(readers);
SetEvent(event);
}
写者:
{
cs.lock();
while (readers > 0)
{
WaitEvent(event);
ResetEvent(event);
}
任务代码;
cs.unlock();
}
------解决方案--------------------
1. 不会发生死锁。
2. 用Sleep(1)这种轮询的方式来等待肯定不是太好。
读者写者问题是多线程同步的经典问题,楼主可以参考我写的二篇文章:
《秒杀多线程第十一篇 读者写者问题》
http://blog.****.net/morewindows/article/details/7596034
《秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock》
http://blog.****.net/morewindows/article/details/7650574
------解决方案--------------------
1.不会
2.
结合第二种方法,有一个函数叫做WaitForSingleObject。
解决楼主while这种情况的。(楼主这种情况消耗CPU太厉害了)
cs为临界段,inc和dec为线程安全的累加和累减,readers为读者数。
读者:
{
cs.lock();
inc(readers);
cs.unlock();
任务代码;
dec(readers);
}
写者:
{
cs.lock();
while (readers > 0)
{
Sleep(1);
}
任务代码;
cs.unlock();
}
1.有发生死锁的可能吗?
2.Sleep(1)那个地方觉得不太好,有什么更好的办法吗?这样改进行不行?
event为手动事件。
读者:
{
cs.lock();
inc(readers);
cs.unlock();
任务代码;
dec(readers);
SetEvent(event);
}
写者:
{
cs.lock();
while (readers > 0)
{
WaitEvent(event);
ResetEvent(event);
}
任务代码;
cs.unlock();
}
------解决方案--------------------
1. 不会发生死锁。
2. 用Sleep(1)这种轮询的方式来等待肯定不是太好。
读者写者问题是多线程同步的经典问题,楼主可以参考我写的二篇文章:
《秒杀多线程第十一篇 读者写者问题》
http://blog.****.net/morewindows/article/details/7596034
《秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock》
http://blog.****.net/morewindows/article/details/7650574
------解决方案--------------------
1.不会
2.
结合第二种方法,有一个函数叫做WaitForSingleObject。
解决楼主while这种情况的。(楼主这种情况消耗CPU太厉害了)