共享资源最快的多读/单写保护 - C++

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)

How*_*ant 9

离开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读/写互斥实现.如果你有关于如何改进它的想法,我会欢迎他们.