pcu*_*ite 2 c++ boost mutex locking thread-safety
我想确认我的方法是非常快速的,适用于多数读者的跨平台保护,使用C++的单一编写器方法.它有利于编写者,当他们输入所有当前线程时,允许完成,但任何类型的所有新线程都必须等待.这两个功能的反面应该是显而易见的.
我已经完成的读数表明,boost shared_mutex和其他类型的rwlock没有很好地实现,应该避免.事实上,shared_mutex不会使它成为C++ 0x我接受它.看到Anthony Williams的回复.
似乎甚至可以写入整数,如果正确对齐则不需要锁定任何类型.那里有很多文章,关于这个主题的任何好的阅读,所以我不必从谷壳中分拣小麦?
void AquireReadLock(void)
{
mutex::enter();
if(READ_STATE == true)
{
iReaders++;
mutex::leave();
return;
}
else
{
mutex::leave();
sleep(1);
AquireReadLock();
return;
}
}
void AquireWriteLock(void)
{
mutex::enter();
READ_STATE = false;
if (iReaders != 0)
{
mutex::leave();
sleep(1);
AquireWriteLock();
return;
}
else
{
mutex::leave();
return;
}
}
Run Code Online (Sandbox Code Playgroud)
离开shared_mutex的决定与任何质量问题无关.该决定是2007年秋季"Kona妥协"的一部分.此妥协旨在减少C++ 0x的功能集,以便在2009年之前发布标准.它没有用,但尽管如此,是基本原理.
在委员会完成C++ 0x之后,将讨论shared_mutex以包含在技术报告(即tr2)中.图书馆工作组的主席已就此问题与我联系.这并不是说shared_mutex将在tr2中.只是它将被讨论.
你对AquireReadLock和AquireWriteLock的实现有一个缺点,就是它们在争用时以每秒一次的速度吃堆栈帧.当争用结束时,他们会在做出反应之前延迟一秒钟.这使得他们既挨饿又表现不佳(对不起).
如果您有兴趣,可以在此处获得shared_mutex的完整描述和实现:
http://home.roadrunner.com/~hinnant/mutexes/locking.html
该代码不是boost的一部分,但确实带有boost开源许可证.随意使用它,只需保留源代码的版权.没有其他附加条件.这是它与AquireReadLock的类比:
void
shared_mutex::lock_shared()
{
std::unique_lock<mutex_t> lk(mut_);
while ((state_ & write_entered_) || (state_ & n_readers_) == n_readers_)
gate1_.wait(lk);
count_t num_readers = (state_ & n_readers_) + 1;
state_ &= ~n_readers_;
state_ |= num_readers;
}
Run Code Online (Sandbox Code Playgroud)
这是它与AquireWriteLock的模拟:
void
shared_mutex::lock()
{
std::unique_lock<mutex_t> lk(mut_);
while (state_ & write_entered_)
gate1_.wait(lk);
state_ |= write_entered_;
while (state_ & n_readers_)
gate2_.wait(lk);
}
Run Code Online (Sandbox Code Playgroud)
我认为这是一个经过充分测试和高性能,公平的C/C读/写互斥实现.如果你有关于如何改进它的想法,我会欢迎他们.