📄 read_write_lock.hpp
字号:
return true;
}
return false;
}
bool timed_write_lock(const xtime &xt)
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TimedReadWriteMutex>::timed_write_lock(m_mutex,xt))
{
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<TimedReadWriteMutex>::read_unlock(m_mutex);
else //(m_state == read_write_lock_state::write_locked)
read_write_lock_ops<TimedReadWriteMutex>::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<TimedReadWriteMutex>::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<TimedReadWriteMutex>::try_demote(m_mutex) ? (m_state = read_write_lock_state::read_locked, true) : false;
}
bool timed_demote(const xtime &xt)
{
if (m_state != read_write_lock_state::write_locked) throw lock_error();
return read_write_lock_ops<TimedReadWriteMutex>::timed_demote(m_mutex, xt) ? (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<TimedReadWriteMutex>::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<TimedReadWriteMutex>::try_promote(m_mutex) ? (m_state = read_write_lock_state::write_locked, true) : false;
}
bool timed_promote(const xtime &xt)
{
if (m_state != read_write_lock_state::read_locked) throw lock_error();
return read_write_lock_ops<TimedReadWriteMutex>::timed_promote(m_mutex, xt) ? (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 timed_set_lock(read_write_lock_state::read_write_lock_state_enum ls, const xtime &xt)
{
if (m_state != ls)
{
if (m_state == read_write_lock_state::unlocked)
{
if (ls == read_write_lock_state::read_locked)
return timed_read_lock(xt);
else // (ls == read_write_lock_state::write_locked)
return timed_write_lock(xt);
}
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 timed_demote(xt);
else if (ls == read_write_lock_state::write_locked)
return timed_promote(xt);
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:
TimedReadWriteMutex& m_mutex;
read_write_lock_state::read_write_lock_state_enum m_state;
};
template <typename TimedReadWriteMutex>
class scoped_timed_read_lock : private noncopyable
{
public:
typedef TimedReadWriteMutex mutex_type;
explicit scoped_timed_read_lock(
TimedReadWriteMutex& mx,
bool initially_locked = true)
: m_mutex(mx), m_state(read_write_lock_state::unlocked)
{
if (initially_locked)
lock();
}
~scoped_timed_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<TimedReadWriteMutex>::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<TimedReadWriteMutex>::try_read_lock(m_mutex))
{
m_state = read_write_lock_state::read_locked;
return true;
}
return false;
}
bool timed_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 unlock()
{
if (m_state != read_write_lock_state::read_locked) throw lock_error();
read_write_lock_ops<TimedReadWriteMutex>::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;
}
read_write_lock_state::read_write_lock_state_enum state() const
{
return m_state;
}
private:
TimedReadWriteMutex& m_mutex;
read_write_lock_state::read_write_lock_state_enum m_state;
};
template <typename TimedReadWriteMutex>
class scoped_timed_write_lock : private noncopyable
{
public:
typedef TimedReadWriteMutex mutex_type;
explicit scoped_timed_write_lock(
TimedReadWriteMutex& mx,
bool initially_locked = true)
: m_mutex(mx), m_state(read_write_lock_state::unlocked)
{
if (initially_locked)
lock();
}
~scoped_timed_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<TimedReadWriteMutex>::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<TimedReadWriteMutex>::try_write_lock(m_mutex))
{
m_state = read_write_lock_state::write_locked;
return true;
}
return false;
}
bool timed_lock(const xtime &xt)
{
if (m_state != read_write_lock_state::unlocked) throw lock_error();
if(read_write_lock_ops<TimedReadWriteMutex>::timed_write_lock(m_mutex,xt))
{
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<TimedReadWriteMutex>::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;
}
read_write_lock_state::read_write_lock_state_enum state() const
{
return m_state;
}
private:
TimedReadWriteMutex& m_mutex;
read_write_lock_state::read_write_lock_state_enum m_state;
};
} // namespace thread
} // namespace detail
} // namespace boost
#endif
// Change Log:
// 10 Mar 02
// Original version.
// 4 May 04 GlassfordM
// Implement lock promotion and demotion (add member functions demote(),
// try_demote(), timed_demote(), try_promote(), timed_promote(); note
// that there is intentionally no promote() member function).
// Add set_lock() member function.
// Change try lock & timed lock constructor parameters for consistency.
// Rename to improve consistency and eliminate abbreviations:
// Use "read" and "write" instead of "shared" and "exclusive".
// Change "rd" to "read", "wr" to "write", "rw" to "read_write".
// Add mutex_type typdef.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -