首页 > 编程语言 >C++ stl锁的使用

C++ stl锁的使用

时间:2023-07-22 16:14:01浏览次数:30  
标签:iKey stl lock mapTest C++ 线程 ReadThread 使用 shared

我们在日常开发中经常要用到锁,这里记录一下实际开发过程中stl提供的锁的使用。

1、读写锁

读写锁算是用到的比较多的一种类型,主要实现对于同一个共享数据区,一个时间点只能有一个线程进行写(增删改),但可以有多个线程同时读(查)。换句话说,当有一个线程写的时候,其他线程(不管是读线程还是写线程)都必须等待;而有一个线程读的时候,其他的读线程也可以读,但是写线程要等待。

当前在实现读写锁用到了 shared_mutex、shared_lock 和 unique_lock,示例代码如下:

 1 // 作为共享数据区
 2 std::map<int, int> g_mapTest;
 3 
 4 // 创建一个读写锁对象
 5 std::shared_mutex mtx;
 6 
 7 // 获取map里面key为iKey的值
 8 void ReadThread(int iKey)
 9 {
10     std::shared_lock<std::shared_mutex> lock(mtx);
11     auto iter = g_mapTest.find(iKey);
12     if(g_mapTest.end() == iter)
13     {
14         return;
15     }
16     
17     //do something
18 }
19 
20 // 更新map里面key是iKey的值为iVal
21 void WriteThread(int iKey, int iVal)
22 {
23     std::unique_lock<std::shared_mutex> lock(mtx);
24     g_mapTest[iKey] = iVal;
25 }

 

这里假设有多个 ReadThread 和多个 WriteThread,那么每次 WriteThread 执行的时候,其他线程进来都会阻塞在 lock 的位置;而 ReadThread 执行的时候,其他的 ReadThread 也是可以执行的,而不被阻塞的,但是其他的 WriteThread 是被阻塞的。

标签:iKey,stl,lock,mapTest,C++,线程,ReadThread,使用,shared
From: https://www.cnblogs.com/Arthurian/p/17555420.html

相关文章

  • spring boot 事务使用
    SpringBoot事务使用指南介绍在开发过程中,处理数据库操作时经常需要使用事务来保证数据的一致性和完整性。SpringBoot提供了简单且强大的事务管理机制,本文将介绍如何在SpringBoot中使用事务。流程概述使用SpringBoot进行事务管理的一般流程如下所示:步骤描述1配......
  • redis中的Cursor使用实例
    Redis中的Cursor使用实例Redis是一种高性能的键值存储系统,常用于缓存、消息队列和排行榜等应用场景。在Redis中,Cursor是一种用于遍历集合元素的机制。通过使用Cursor,我们可以逐步地获取集合中的元素,而不需要一次性将整个集合加载到内存中。什么是Cursor在Redis中,Cursor是一个游......
  • DevExpress中GridControl控件的基本属性设置和使用方法
    (18条消息)DevExpress中GridControl控件的基本属性设置和使用方法_gridcontrol隐藏列_潘达小新的博客-CSDN博客......
  • 4.C++和Python
    C++是编译性语言,Python是解释性语言C++编译链接的全过程分为:预编译预编译会执行以下内容:宏替换执行条件编译:#ifdef,#ifndef,#endif#include后面文件内容插入并替换当前行删除注释编译编译会执行以下内容:检查有没有语法错误,没有的话转换为汇编语言,汇编过程再将汇编语言转......
  • 112.STL中的array
    112.STL中的array1.array介绍在C++标准库中,array是固定大小的序列容器,array中包含特定个数并且严格按照线性序列排序的元素。因此array允许对元素进行随机访问,指向某一元素的指针可以通过偏移访问其他元素。在array内部,它只保存自己包含的元素,其他任何信息都不保存,包括自身的大......
  • java内存分析工具使用
    目录参考链接1、名词解释2、常见异常java堆内存异常java栈内存异常方法区内存异常3、解决思路4、生成dump文件的三种方式jvisualvmjmap命令应用启动配置5、MemoryAnalyzer分析工具参考链接Java内存溢出OOM之dump分析1、名词解释内存泄露:代码中的某个对象本应该被虚拟机回收,......
  • 1.C++入门&&简单顺序结构-习题
    1.C++入门&&简单顺序结构1.计算(a+b)*c的值 inta,b,c; cin>>a>>b>>c; cout<<(a+b)*c;2.带余除法 inta,b; cin>>a>>b; cout<<a/b<<""<<a%b; //C++中取余结果正负只与%前面的数有关系 cout<<5%2<<endl......
  • [爬虫]2.2.1 使用Selenium库模拟浏览器操作
    Selenium是一个非常强大的工具,用于自动化Web浏览器的操作。它可以模拟真实用户的行为,如点击按钮,填写表单,滚动页面等。由于Selenium可以直接与浏览器交互,所以它可以处理那些需要JavaScript运行的动态网页。安装Selenium首先,我们需要安装Selenium库。你可以使用pip命令来安装:pip......
  • git cherry-pick的使用
    gitcherry-pick<commitid>是用来将其他某个分支上的某次commit复制到当前分支假设你的项目提交历史如下:(箭头相当于一个指针,表示当前这个commit是基于指向的那个commit修改的,HEAD也是一个这样的指针)如果你希望将提交e43a6拉取到master分支,你可以执行:$gitcheckout......
  • WebApi 动态参数 dynamic 使用
    在调用WebAPI时,调用方法主要有get和post,但参数传递需要注意几点,下面简单介绍一下ajax调用时传参的几种方法:webapiusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Http;usingSystem.Web.Http;usingSystem.Web.......