c++11の数据竞争和互斥对象
一、数据竞争的产生
在下面例子中:
void function_1()
{
for (int i = ; i < ; i++)
{
std::cout << "from function 1:" << i << std::endl;
} } int main()
{
std::thread t(function_1); for (int i = ; i < ; i++)
{
std::cout << "from function main:"<<i<<std::endl;
} t.join(); std::getchar(); return ;
}
我们发现其输出的毫无规律,因为主线程和子线程同时调用cout对象造成的,产生了数据竞争
二、互斥对象
上面的问题可以通过互斥对象来解决
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <string>
using namespace std;
std::mutex mu; void share_print(std::string msg,int id)
{
mu.lock();
cout << msg << id << endl;
mu.unlock();
} void function_1()
{
for (int i = ; i < ; i++)
{
share_print("from function 1:",i);
} } int main()
{
std::thread t(function_1); for (int i = ; i < ; i++)
{
share_print("from main:", i);
} t.join(); std::getchar(); return ;
}
但是如果cout中发现异常,那么程序将被永远锁住,除非能够保证要锁住的对象不会出现问题,有此引出一下方法
void share_print(std::string msg,int id)
{
std::lock_guard<std::mutex> gard(mu);
cout << msg << id << endl; }
此类并不能阻止其他线程调用cout
三、LogfFile类
class LogfFile
{
public:
LogfFile() {
f.open("log.txt");
}
void share_print(std::string msg, int id)
{
std::lock_guard<std::mutex> gard(m_mutex);
f << msg << id << endl; } private:
std::mutex m_mutex;
std::ofstream f;
}; void function_1(LogfFile & log)
{
for (int i = ; i < ; i++)
{
log.share_print("from function 1:",i);
} } int main()
{
LogfFile log;
std::thread t(function_1,ref(log)); for (int i = ; i < ; i++)
{
log.share_print("from main:", i);
} t.join(); std::getchar(); return ;
}
注意f不能对外开放
c++11の数据竞争和互斥对象的更多相关文章
- c++多线程の数据竞争和互斥对象
看两个代码: void function() { ;i>;i--) { cout<<"from sub thread"+i<<endl; } } vo ...
- 2016年11月3日JS脚本简介数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6.布尔型数据:bool 7.对象类型:object 8.二进制:binary 语言类型: 1.强类型语言:c++ c c# java 2.弱类型语
数据类型: 1.整型:int 2.小数类型: float(单精度) double(双精度) decimal () 3.字符类型: chr 4.字符串类型:sting 5.日期时间:datetime 6 ...
- Java 多线程 死锁 隐性死锁 数据竞争 恶性数据竞争 错误解决深入分析 全方向举例
在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些特殊的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同.因此,在编写多线程程序时,事先认 ...
- c++多线程编程之互斥对象(锁)的使用之----死锁
一.死锁会在什么情况发生 1.假设有如下代码 mutex; //代表一个全局互斥对象 void A() { mutex.lock(); //这里操作共享数据 B(); //这里调用B方法 mu ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换
[源码下载] 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换 作者:webabcd 介绍速战速决 之 PHP ...
- 互斥对象 Mutex 和MFC中的CMutex
互斥(Mutex)是一种用途非常广泛的内核对象.能够保证多个线程对同一共享资源的互斥访问.同临界区有些类似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共 ...
- C++11之使用或禁用对象的默认函数
[C++11之使用或禁用对象的默认函数] C++11 允许显式地表明采用或拒用编译器提供的内置函数.例如要求类型带有默认构造函数,可以用以下的语法: 另一方面,也可以禁止编译器自动产生某些函数.如下面 ...
- QTableWidget 用法总结(只能使用标准的数据模型,并且其单元格数据是QTableWidgetItem的对象)
QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到QTableWidget,就必须讲一下它跟QTabelView的区别了.QTableWidge ...
随机推荐
- MVC模型注解
首先,model是通过ef自动是生成的实体. 添加模型注解的意思就是在注册的时候自动验证用户所填信息是否符合我们规定的要求(这是我们做这个例子的要求) 首先给大家先展示一下效果吧. 然后Email是点 ...
- 使用mongoskin操作MongoDB
mongoskin是一个操作MongoDB的模型工具 相当于数据库类 与之相当的还有mongoose比较出名 安装模块(特地加了版本,这里被坑过,在Ubuntu中开发的好好的,部署到线上centos中 ...
- 【Java基础】【18Map集合&模拟斗D主X排和F排】
18.01_集合框架(Map集合概述和特点) A:Map接口概述 查看API可以知道: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接 ...
- selenium和webdriver区别
接触selenium大概半年时间了.从开始的预研,简单的写个流程到后期的自动化框架的开发,因为本人不属于代码方面的大牛,一直的边研究边做.逐步深入学习.近期发现自己对本身selenium的发展还存在困 ...
- MaxCompute在高德大数据上的应用
2019年1月18日,由阿里巴巴 MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,高德数据技术专家苗翌辰为大家分享了高德如何 ...
- 大前端的自动化工厂(2)—— SB Family
原文链接:https://bbs.huaweicloud.com/blogs/53c0c3509b7a11e89fc57ca23e93a89f 我坦白我是标题党,SB只是SCSS-Bourbon的简写 ...
- Acer宏碁笔记本触摸板失效解决方法
打开windows设置,找到鼠标设置 之后,选择触摸板设置,将其开启 PS: 由于我是安装完驱动之后,才发现有这个触摸板设置的 如果找不到这个触摸板设置的哈,应该就是驱动安装完之后就有了 驱动的话去官 ...
- input框限制只能输入正整数、字母、小数、
这篇博文大部分来自于网上,为了方便自己查阅,以及帮助他人. 1,只能输入正整数 <input onkeyup="if(this.value.length==1){this.valu ...
- jsp基础语言-jsp指令
jsp编译指令用于设置jsp程序的属性以及由jsp生成的servlet中的属性. jsp常用的编译指令有3个:include指令.page指令.taglib指令. 一.page指令 1.概念:用来设置 ...
- 前端入门15-JavaScript进阶之原型链
声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...