C++ 多线程学习(二) 互斥锁std::mutex

2023-11-16

在多线程中经常会遇到多个线程同时修改同一个变量的情况,这个时候如果不对线程进行一定约束,很可能会导致意想不到的结果。例如有两个线程1和线程2,线程2的输入是线程1的结果。很显然如果在主线程中同时开启了线程1和线程2,它们是同时运行的,会直接导致程序的崩溃。所以线程同步锁应运而生,当遇到它时它会让当前线程独占某个变量,其它同样需要修改该变量的线程此时只能处于等待状态,等到当前线程结束之后,线程独占锁自动释放,其它线程可以修改内容。

// mutex example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

std::mutex mtx;           // mutex for critical section
int counter=0;
void print_block (int n) {
  // critical section (exclusive access to std::cout signaled by locking mtx):
 // mtx.lock();
  for (int i=0; i<n; ++i) { 
 // std::cout << '\n';
     std::this_thread::sleep_for(std::chrono::milliseconds(1));
 counter++;}
 // mtx.unlock();
}

int main ()
{
  std::thread th1 (print_block,50);
  std::thread th2 (print_block,50);

  th1.join();
  th2.join();
  
  std::cout << "counter:" << counter << std::endl;
  return 0;
}

#include<thread>  
#include<mutex>  
using namespace std;  
const int N = 100000000;  
int num(0);  
mutex m;  
void run()  
{  
    for (int i = 0; i < N; i++)  
    {  
        m.lock();  
        num++;  
        m.unlock();  
    }  
}  
int main()  
{  
    clock_t start = clock();  
    thread t1(run);  
    thread t2(run);  
    t1.join();  
    t2.join();  
    clock_t end = clock();  
    cout << "num=" << num << ",用时 " << end - start << " ms" << endl;  
    return 0;  
}  
运行结果:  
num=200000000,用时 128323 ms

加锁后计算正确,但由于加锁和解锁导致时间增加;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 多线程学习(二) 互斥锁std::mutex 的相关文章

  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem

随机推荐

  • 服务器物理结构,物理 I/O 体系结构

    物理 I O 体系结构 与以前发行版的 M 系列服务器相比 这些服务器的物理 I O 体系结构发生了变化 使用了不同的名称 并且 CPU 不再拥有 PCIe 结构 I O 术语 用于描述 I O 体系结构的术语发生了如下变化 根联合体 在
  • React Effects(副作用)

    我们在之前提到过 React 组件在渲染过程中不应该有可观察到的副作用 但是有些时候副作用确实必要的 我们也许需要进行管理 focus 状态 用 canvas 画图 订阅数据源等操作 在 React 中 这些都可以通过声明 effect 来
  • ag-grid 自带css样式记录

    本篇文章是打算自己用于记录ag grid自身的css样式的记录和功能 1 ag header group cell with group 作用 多表头 前几层 最后一行表头除外 表头样式的设置 ag header group cell wi
  • pg备份数据库

    原文 http www weijingbiji com 1975 PostgreSQL备份工具pg dump和pg dumpall PostgreSQL 数据库 作者 viking PostgreSQL使用 pg dump 和 pg dum
  • [知识图谱实战篇] 七.HTML+D3实现关系图谱搜索功能

    前面作者讲解了很多知识图谱原理知识 包括知识图谱相关技术 Neo4j绘制关系图谱等 但仍缺少一个系统全面的实例 为了加深自己对知识图谱构建的认识 为后续创建贵州旅游知识图谱打下基础 作者深入学习了张宏伦老师的网易云课程 星球系列电影 并结合
  • Python利用demoji库删除文档中的表情符号

    在进行数据清洗时 往往需要删除文档中的出现的表情符号 因为他们无法被读取 借助demoji库 可以非常简单地完成这项工作 关于demoji 库的文档 可以访问demoji PyPI 首先 需要在环境中利用pip install安装demoj
  • 可拖拽的easyui treegrid

    引用 JQuery EasyUI TreeGrid控件的使用 支持拖拽与禁止拖拽 演示
  • 实际的机械臂控制(9)Moveit单独控制机械臂末端在XYZ三个轴的平移和旋转(基于python)

    0 序言 在moveit中 控制机械臂的末端执行器运动的API有两个 分别是 shift pose target set pose target 第一个API shift pose target 其实这个函数在旋转角度这块并不会得到让大家满
  • flutter 中stack 控件的 大小是如何确定的

    stack 控件 stack 是我们在flutter中常用到的控件 然而stack的大小是如何确定的是一个值得探究的问题 自己在网上也进行了搜索 但是总是不能解释自己遇到的新情况 所以我这里就根据目前的经验对stack大小是如何确定的进行一
  • 泰森多边形(Voronoi图)生成算法

    一 文档目的 本文描述了在geomodel模块中 生成泰森多边形所使用的算法 二 概述 GIS和地理分析中经常采用泰森多边形进行快速插值 和分析地理实体的影响区域 是解决邻接度问题的又一常用工具 荷兰气候学家A H Thiessen提出了一
  • 软件构架、架构和框架的区别

    软件框架 Software Framework 介绍 面向某领域 包括业务领域 如ERP 和计算领域 如GUI 的 可复用的 半成品 软件 它实现了该领域的共性部分 并提供一系列定义良好的可变点以保证灵活性和可扩展性 可以说 软件框架是领域
  • 重新学javaweb---ServletContext

    WEB容器在启动时 它会为每个WEB应用程序都创建一个对应的ServletContext对象 它代表当前web应用 这个对象创建出来之后就一直在内存中驻留 代表当前的web应用 它可以通过我们上一篇介绍的ServletConfig对象获取
  • arm-linux-gcc char与signed char和unsigned char

    1 三者关系 1 ANSI C 提供了3种字符类型 分别是char signed char unsigned char 而不是像short int一样只有两种 int默认就是unsigned int 2 三者都占1个字节 3 signed
  • 不规则语法命名数据框tibble

    本题来自 R数据科学 第7章使用tibble实现简单数据框 4 在以下的数据框中练习如何引用不符合语法规则的变量名 a 提取名称为 1 的变量 b 绘制表示变量 1 和变量 2 关系的散点图 c 创建一个名称为 3 的新列 其值为列 2 除
  • make_heap(), pop_heap(), push_heap()用法

    对make heap pop heap push heap 的用法做个总结 make heap 生成堆 他有两个参数 也可以有三个参数 前两个参数是指向开始元素的迭代器和指向结束元素的下一个元素的迭代器 第三个参数是可选的 可以用伪函数le
  • Python爬虫——8-1.scrapy深度爬取案例—百思不得姐

    对于scrapy框架的使用 爬取数据 多次运行命令行也是比较头疼和麻烦的 这里建议Windows R键输入cmd进入命令行 切入至项目所在目录后执行scrapy shell url 命令 可以很直观的检测程序是否出错 如xpath匹配路径是
  • 蓝桥杯经验分享

    作为已经入码坑的一员 在开始接触的时候一窍不通 老师讲完之后自己再写一遍都写不出来的那种 很是沮丧 失落 后来到了大二 逐渐的找到了感觉 在学习了诸如C C java python之后 感觉诸多编程语言殊途同归 编者观点 学习编程语言入手最
  • IDEA文件右键创建New没有Create New Servlet的解决办法

    Author codepig16 interesting wtsb7 1 问题描述 创建了一个Javaweb项目但是在src中右键创建中 没有Servlet选项 如下图所示 2 解决方案 解决方案分为三步 笔者本人是在第三步有问题 估计大部
  • Qt中左侧列表与右侧窗口关联

    左边列表选项与右边窗体关联 QListWidget list new QListWidget this list gt insertItem 0 tr Window1 list gt insertItem 1 tr Window2 QLab
  • C++ 多线程学习(二) 互斥锁std::mutex

    在多线程中经常会遇到多个线程同时修改同一个变量的情况 这个时候如果不对线程进行一定约束 很可能会导致意想不到的结果 例如有两个线程1和线程2 线程2的输入是线程1的结果 很显然如果在主线程中同时开启了线程1和线程2 它们是同时运行的 会直接