📄 read_write_lock.hpp
字号:
unlock();
}
void read_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::read_lock(m_mutex);
m_state = read_write_lock_state::read_locked;
}
bool try_read_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TryReadWriteMutex>::try_read_lock(m_mutex))
{
m_state = read_write_lock_state::read_locked;
return true;
}
return false;
}
void write_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::write_lock(m_mutex);
m_state = read_write_lock_state::write_locked;
}
bool try_write_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TryReadWriteMutex>::try_write_lock(m_mutex))
{
m_state = read_write_lock_state::write_locked;
return true;
}
return false;
}
void unlock()
{
if (m_state == read_write_lock_state::unlocked) throw lock_error();
if (m_state == read_write_lock_state::read_locked)
read_write_lock_ops<TryReadWriteMutex>::read_unlock(m_mutex);
else //(m_state == read_write_lock_state::write_locked)
read_write_lock_ops<TryReadWriteMutex>::write_unlock(m_mutex);
m_state = read_write_lock_state::unlocked;
}
void demote(void)
{
if (m_state != read_write_lock_state::write_locked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::demote(m_mutex);
m_state = read_write_lock_state::read_locked;
}
bool try_demote(void)
{
if (m_state != read_write_lock_state::write_locked) throw lock_error();
return read_write_lock_ops<TryReadWriteMutex>::try_demote(m_mutex) ? (m_state = read_write_lock_state::read_locked, true) : false;
}
void promote(void)
{
if (m_state != read_write_lock_state::read_locked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::promote(m_mutex);
m_state = read_write_lock_state::write_locked;
}
bool try_promote(void)
{
if (m_state != read_write_lock_state::read_locked) throw lock_error();
return read_write_lock_ops<TryReadWriteMutex>::try_promote(m_mutex) ? (m_state = read_write_lock_state::write_locked, true) : false;
}
//If allow_unlock = true, set_lock always succeeds and
//the function result indicates whether an unlock was required.
//If allow_unlock = false, set_lock may fail;
//the function result indicates whether it succeeded.
bool set_lock(read_write_lock_state::read_write_lock_state_enum ls, bool allow_unlock = true)
{
bool result = !allow_unlock;
if (m_state != ls)
{
if (m_state == read_write_lock_state::unlocked)
{
if (ls == read_write_lock_state::read_locked)
read_lock();
else //(ls == read_write_lock_state::write_locked)
write_lock();
}
else //(m_state == read_write_lock_state::read_locked || m_state == read_write_lock_state::write_locked)
{
if (ls == read_write_lock_state::read_locked)
demote();
else if (ls == read_write_lock_state::write_locked)
{
if (!try_promote())
{
if (allow_unlock)
{
result = true;
unlock();
write_lock();
}
else
result = false;
}
}
else //(ls == read_write_lock_state::unlocked)
unlock();
}
}
return result;
}
bool try_set_lock(read_write_lock_state::read_write_lock_state_enum ls)
{
if (m_state != ls)
{
if (m_state == read_write_lock_state::unlocked)
{
if (ls == read_write_lock_state::read_locked)
return try_read_lock();
else // (ls == read_write_lock_state::write_locked)
return try_write_lock();
}
else //(m_state == read_write_lock_state::read_locked || m_state == read_write_lock_state::write_locked)
{
if (ls == read_write_lock_state::read_locked)
return try_demote();
else if (ls == read_write_lock_state::write_locked)
return try_promote();
else //(ls == read_write_lock_state::unlocked)
return unlock(), true;
}
}
else //(m_state == ls)
return true;
}
bool locked() const
{
return m_state != read_write_lock_state::unlocked;
}
bool read_locked() const
{
return m_state == read_write_lock_state::read_locked;
}
bool write_locked() const
{
return m_state != read_write_lock_state::write_locked;
}
operator const void*() const
{
return (m_state != read_write_lock_state::unlocked) ? this : 0;
}
read_write_lock_state::read_write_lock_state_enum state() const
{
return m_state;
}
private:
TryReadWriteMutex& m_mutex;
read_write_lock_state::read_write_lock_state_enum m_state;
};
template <typename TryReadWriteMutex>
class scoped_try_read_lock : private noncopyable
{
public:
typedef TryReadWriteMutex mutex_type;
explicit scoped_try_read_lock(
TryReadWriteMutex& mx,
bool initially_locked = true)
: m_mutex(mx), m_state(read_write_lock_state::unlocked)
{
if (initially_locked)
lock();
}
~scoped_try_read_lock()
{
if (m_state != read_write_lock_state::unlocked)
unlock();
}
void lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::read_lock(m_mutex);
m_state = read_write_lock_state::read_locked;
}
bool try_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TryReadWriteMutex>::try_read_lock(m_mutex))
{
m_state = read_write_lock_state::read_locked;
return true;
}
return false;
}
void unlock()
{
if (m_state != read_write_lock_state::read_locked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::read_unlock(m_mutex);
m_state = read_write_lock_state::unlocked;
}
bool locked() const
{
return m_state != read_write_lock_state::unlocked;
}
operator const void*() const
{
return (m_state != read_write_lock_state::unlocked) ? this : 0;
}
private:
TryReadWriteMutex& m_mutex;
read_write_lock_state::read_write_lock_state_enum m_state;
};
template <typename TryReadWriteMutex>
class scoped_try_write_lock : private noncopyable
{
public:
typedef TryReadWriteMutex mutex_type;
explicit scoped_try_write_lock(
TryReadWriteMutex& mx,
bool initially_locked = true)
: m_mutex(mx), m_state(read_write_lock_state::unlocked)
{
if (initially_locked)
lock();
}
~scoped_try_write_lock()
{
if (m_state != read_write_lock_state::unlocked)
unlock();
}
void lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::write_lock(m_mutex);
m_state = read_write_lock_state::write_locked;
}
bool try_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TryReadWriteMutex>::try_write_lock(m_mutex))
{
m_state = read_write_lock_state::write_locked;
return true;
}
return false;
}
void unlock()
{
if (m_state != read_write_lock_state::write_locked) throw lock_error();
read_write_lock_ops<TryReadWriteMutex>::write_unlock(m_mutex);
m_state = read_write_lock_state::unlocked;
}
bool locked() const
{
return m_state != read_write_lock_state::unlocked;
}
operator const void*() const
{
return (m_state != read_write_lock_state::unlocked) ? this : 0;
}
private:
TryReadWriteMutex& m_mutex;
read_write_lock_state::read_write_lock_state_enum m_state;
};
template <typename TimedReadWriteMutex>
class scoped_timed_read_write_lock : private noncopyable
{
public:
typedef TimedReadWriteMutex mutex_type;
scoped_timed_read_write_lock(
TimedReadWriteMutex& mx,
read_write_lock_state::read_write_lock_state_enum initial_state)
: m_mutex(mx), m_state(read_write_lock_state::unlocked)
{
if (initial_state == read_write_lock_state::read_locked)
read_lock();
else if (initial_state == read_write_lock_state::write_locked)
write_lock();
}
~scoped_timed_read_write_lock()
{
if (m_state != read_write_lock_state::unlocked)
unlock();
}
void read_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
read_write_lock_ops<TimedReadWriteMutex>::read_lock(m_mutex);
m_state = read_write_lock_state::read_locked;
}
bool try_read_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TimedReadWriteMutex>::try_read_lock(m_mutex))
{
m_state = read_write_lock_state::read_locked;
return true;
}
return false;
}
bool timed_read_lock(const xtime &xt)
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TimedReadWriteMutex>::timed_read_lock(m_mutex,xt))
{
m_state = read_write_lock_state::read_locked;
return true;
}
return false;
}
void write_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
read_write_lock_ops<TimedReadWriteMutex>::write_lock(m_mutex);
m_state = read_write_lock_state::write_locked;
}
bool try_write_lock()
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TimedReadWriteMutex>::try_write_lock(m_mutex))
{
m_state = read_write_lock_state::write_locked;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -