C++14 17共享超时互斥锁 shared_timed_mutex / 共享锁 shared_mutex

共享锁,也叫读写锁,主要应用与读多写少的场景

比如,在多线程环境下,多个线程操作同一个文件,其中读文件的操作比写文件的操作更加频繁,那么在进行读操作时,不需要互斥,线程间可以共享这些数据,随意的读取。但是一旦有写操作,那么一定要进行互斥操作,否则读取到的数据可能存在不一致。

C++14 共享超时互斥锁 shared_timed_mutex

读线程 调用 lock_shared()获取共享锁,写线程 调用 lock() 获取互斥锁。

  • 当调用lock()的时候,如果有线程获取了共享锁,那么写线程会等待,直到所有线程将数据读取完成释放共享锁,再去锁定资源,进行修改;
  • 当调用lock_shared()时,如果有写线程获取了互斥锁,那么需要等待
  • 当调用lock_shared()时,如果有读线程获取共享锁,也会直接返回,获取成功。

代码示例:

std::shared_timed_mutex stmtx;

void ReadThread()
{
    while (true)
    {
        stmtx.lock_shared();
        std::cout << "thread id = " << std::this_thread::get_id() << " lock shared  read" << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(200));
        stmtx.unlock_shared();
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}

void WriteThread()
{
    while (true)
    {
        stmtx.lock();
        std::cout << "thread id = " << std::this_thread::get_id() << " lock  write" << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        stmtx.unlock();
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}


int main()
{
    for(int i = 0; i < 3; ++i)
    {
        std::thread t(ReadThread);
        t.detach();
    }

    for(int i = 0; i < 2; ++i)
    {
        std::thread t(WriteThread);
        t.detach();
    }

    getchar();
    return 0;
}

执行结果:

thread id = 139663449360128 lock  write
thread id = 139663457752832 lock shared  read
thread id = 139663474538240 lock shared  read
thread id = 139663466145536 lock shared  read
thread id = 139663440967424 lock  write
thread id = 139663474538240 lock shared  read
thread id = 139663466145536 lock shared  read
thread id = 139663457752832 lock shared  read
thread id = 139663449360128 lock  write
thread id = 139663457752832 lock shared  read
thread id = 139663466145536 lock shared  read
thread id = 139663474538240 lock shared  read
thread id = 139663440967424 lock  write
thread id = 139663466145536 lock shared  read
thread id = 139663457752832 lock shared  read
thread id = 139663474538240 lock shared  read
thread id = 139663449360128 lock  write
thread id = 139663457752832 lock shared  read
thread id = 139663466145536 lock shared  read
thread id = 139663474538240 lock shared  read
thread id = 139663440967424 lock  write
thread id = 139663457752832 lock shared  read
thread id = 139663466145536 lock shared  read
thread id = 139663474538240 lock shared  read

C++17 共享互斥 shared_mutex

shared_mutex与shared_timed_mutex基本一致,shared_timed_mutex较shared_mutex多了一些与时间相关的接口,如:

try_lock_for(...);
try_lock_shared_for(...);
try_lock_shared_until(...);
try_lock_until(...);

用法和共享超时互斥锁一致,如

std::shared_mutex smtx;
smtx.lock_shared();
smtx.unlock_shared();
smtx.lock();
smtx.unlock();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shared_timed_mutexC++标准库中的一种类型,它是std::shared_mutex的一种变体。与std::shared_mutex相比,shared_timed_mutex提供了带有时间限制的定操作,类似于std::timed_mutex。\[2\]这意味着线程可以尝试在一定时间内获取shared_timed_mutex,如果超过了指定的时间仍未获取到,则可以选择放弃或进行其他处理。 std::shared_mutex通常用于多个读线程可以同时访问同一资源而不导致数据竞争,但只有一个写线程能访问的情况。\[3\]它提供了两种定操作:lock_shared()用于读取共享数据,而lock()用于写入共享数据。当有一个写线程调用lock()时,所有的读线程都会等待该写线程释放。这种机制可以有效地保护共享数据的一致性。 需要注意的是,由于其额外的复杂性,std::shared_mutex和std::shared_timed_mutex相对于普通std::mutex和std::timed_mutex的使用情况比较少见。但在某些特定的场景下,它们确实是有用的。\[1\]如果你需要在多个读线程和一个写线程之间进行同步,并且需要支持带有时间限制的定操作,那么可以考虑使用shared_timed_mutex。 #### 引用[.reference_title] - *1* *2* *3* [C++ 多线程:互斥量(mutex)](https://blog.csdn.net/iuices/article/details/123099747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值