gpt4 book ai didi

C++11多读一写线程互斥锁

转载 作者:IT老高 更新时间:2023-10-28 21:45:25 25 4
gpt4 key购买 nike

我有一个应用程序,其中一些 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--;
}

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

最佳答案

非常接近,需要注意的几件事,在 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
}

如果您不想使用 boost @howardhinmant,请提供指向 reference implementation 的链接。

关于C++11多读一写线程互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com