标签:
杂谈 |
分类: CPP/C |
http://blog.sina.com.cn/s/blog_6bfde80a0100meay.html
测试发现,boost thread库实现的读写锁是读优先的(这一点我现在也不确定了,发现读写锁与运行平台关系太大了,windows 或linux,AMD还是intel,常常导致测试结果大相径庭)。所以当读线程多的时候,几乎无法获取写锁。大部分时候,写优先也许更符合应用的需求。 我参考网上代码,使用boost条件变量和临界区,实现了一个写优先的读写锁。优点是写优先,而且代码逻辑很清晰,缺点是……效率可能比较低。为什么说可 能而不是给出量化数据,是因为我发现不同的读写锁实现,效率与运行的平台关系太大了。代码如下:
#pragma once
#include
class read_write_mutex
{
public:
read_write_mutex()
: read_cnt(0)
, write_cnt(0)
, wait_write_cnt(0)
{
}
~read_write_mutex(){}
void lock_read()
{
boost::mutex::scoped_lock lock(mutex);
while (write_cnt > 0 || wait_write_cnt > 0)
{
allow_read_cond.wait(lock);
}
++ read_cnt;
}
void unlock_read()
{
boost::mutex::scoped_lock lock(mutex);
-- read_cnt;
if (read_cnt == 0 && wait_write_cnt > 0)
{
allow_write_cond.notify_all();
}
}
void lock_write(){
boost::mutex::scoped_lock lock(mutex);
++ wait_write_cnt;
while(read_cnt != 0 || write_cnt != 0){
allow_write_cond.wait(lock);
}
++ write_cnt;
--
wait_write_cnt;
}
void unlock_write(){
boost::mutex::scoped_lock lock(mutex);
-- write_cnt;
if (wait_write_cnt > 0)
{
allow_write_cond.notify_all();
}
else
测试发现,boost thread库实现的读写锁是读优先的(这一点我现在也不确定了,发现读写锁与运行平台关系太大了,windows 或linux,AMD还是intel,常常导致测试结果大相径庭)。所以当读线程多的时候,几乎无法获取写锁。大部分时候,写优先也许更符合应用的需求。 我参考网上代码,使用boost条件变量和临界区,实现了一个写优先的读写锁。优点是写优先,而且代码逻辑很清晰,缺点是……效率可能比较低。为什么说可 能而不是给出量化数据,是因为我发现不同的读写锁实现,效率与运行的平台关系太大了。代码如下:
#pragma once
#include
class read_write_mutex
{
public: