C++ 11多重读取和一个写入线程互斥

VSZ*_*SZM 24 c++ multithreading c++11

我有一个应用程序,其中一些STL容器在3个线程中读取,并用2写入.我知道有多线程容器的TBB,但它不是我的应用程序中的一个选项.

所以我想使用std :: mutex和我的双手使程序线程安全.这是我所做的简单版本:

int readers = 0;
std::mutex write;

// One write, no reads.
void write_fun()
{
    write.lock();// We lock the resource
    while(readers > 0){}// We wait till everyone finishes read.
    // DO WRITE
    write.unlock();// Release
}

// Multiple reads, no write
void read_fun()
{
    // We wait if it is being written.
    while(!write.try_lock()){}
    write.unlock();

    readers++;
    // do read
    readers--;
}
Run Code Online (Sandbox Code Playgroud)

这是在C++ 11中执行此操作的正确方法吗?

aar*_*man 39

非常接近,需要注意的事项,在c ++中为了异常安全性和可读性,IMO,使用RAII锁是件好事.你真正需要的是一个shared_mutex,比如在boost或c ++ 14中.

std::shared_mutex write; //use boost's or c++14 

// One write, no reads.
void write_fun()
{
    std::lock_guard<std::shared_mutex> lock(write);
    // DO WRITE
}

// Multiple reads, no write
void read_fun()
{
    std::shared_lock<std::shared_mutex> lock(write);
    // do read
}
Run Code Online (Sandbox Code Playgroud)

如果你不想使用boost @howardhinmant,那就提供一个参考实现的链接

  • 恐怕 `std::shared_mutex` 是(将是)在 c++17 中,而不是 c++14 中。 (3认同)

Cas*_*sey 8

这是安全的,但仍然可能不公平或不符合要求:

std::atomic<int> readers;
std::mutex write;

// One write, no reads.
void write_fun()
{
    write.lock();// We lock the resource
    while(readers > 0){}// We wait till everyone finishes read.
    // DO WRITE
    write.unlock();// Release
}

// Multiple reads, no write
void read_fun()
{
    // We wait if it is being written.
    write.lock();
    readers++;
    write.unlock();

    // do read
    readers--;
}
Run Code Online (Sandbox Code Playgroud)

具有条件变量的解决方案可以避免繁忙等待readers下降到0,作为读者的练习.