c++多线程の数据竞争和互斥对象
看两个代码:
void function()
{ for(int i=;i>;i--)
{
cout<<"from sub thread"+i<<endl;
}
} void main()
{
thread((function()));
for(int i=;i<;i++)
{
cout<<"from main thread"+i<<endl;
} }
以上由于共用资源cout对象,而出现不规律的输出;
可以通过加入mutex对象进行加锁,需要包含头文件mutex.h
nutex mu;
void shared_printf(string fromThread,int id)
{ mu.lock();
cout<<fromThread+id<<end;
mu.unlock(); }
存在风险是cout中抛出异常将永远锁死;
这时候可以用对象:std::mutex_gard<std::mutex> gard(mu);
对象,无论cout是否成功,都将自动解锁;
具体如下:
nutex mu;
void shared_printf(string fromThread,int id)
{
std::mutex_gard<std::mutex> gard(mu);
cout<<fromThread+id<<end; } 但是以上的代码只保证了在此程序中的互斥,锁并没有完全保护住cout,存在一定的不安全性;以上问题可以通过新建立一个类,私有调用保护;
注意:线程的安全永远是相对的,根据需要控制安全级别
c++多线程の数据竞争和互斥对象的更多相关文章
- c++11の数据竞争和互斥对象
一.数据竞争的产生 在下面例子中: void function_1() { ; i < ; i++) { std::cout << "from function 1:&qu ...
- Windows多线程同步系列之一-----互斥对象
多线程同步之互斥对象 作者:vpoet mail:vpoet_sir@163.com 对卖票问题进行线程间同步,本文将在上文的基础上,使用互斥对象对线程进行同步. 首先看看windows API ...
- Java 多线程 死锁 隐性死锁 数据竞争 恶性数据竞争 错误解决深入分析 全方向举例
在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些特殊的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同.因此,在编写多线程程序时,事先认 ...
- c++多线程编程之互斥对象(锁)的使用之----死锁
一.死锁会在什么情况发生 1.假设有如下代码 mutex; //代表一个全局互斥对象 void A() { mutex.lock(); //这里操作共享数据 B(); //这里调用B方法 mu ...
- C#多线程学习(六) 互斥对象
如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...
- 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
- Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间, ...
- Java多线程之线程的互斥处理
Java多线程之线程的互斥处理 一.前言 多线程程序中的各个线程都是自由运行的,所以它们有时就会同时操作同一个实例.这在某些情况下会引发问题.例如,从银行账户取款时,余额确认部分的代码应该是像下面这样 ...
- 多线程锁:Mutex互斥体,Semaphore信号量,Monitor监视器,lock,原子操作InterLocked
Mutex类 “mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量.互斥量跟临界区中提到的Monitor很相似,只有拥有互斥对象的线程才具有访问资源的权限, ...
随机推荐
- 编写bat(批处理文件)的优势
以前编写java小程序打成jar包运行的时候非常麻烦,在dos环境先cd进入那个文件夹,再运行java -jar *.jar,自从看了bat以后,发现.bat真的是dos下面运行的好帮手. @echo ...
- 最新版CKEditor在线编辑器的配置方法
下载地址: http://ckeditor.com/download 使用方法: 在页面<head>中引入ckeditor核心文件ckeditor.js <script type=& ...
- Python之路-jQuery
参考网址:http://jquery.cuishifeng.cn/ 1.安装环境 2.查找元素 3.操作元素 一.安装环境: 1.我们需要去官网下载jQuery,地址:http://jquery.co ...
- Nexus安装及部署(含如何在Tomcat中部署)
1. Nexus价值 1)方便-节约带宽-快 2)便于统一管理 3)持续集成需要 2.Nexus下载 http://www.sonatype.org/nexus/go 3.Nexus启动 解压后进入\ ...
- Java实现选择排序
选择排序思想就是选出最小或最大的数与第一个数交换,然后在剩下的数列中重复完成该动作. package Sort; import java.util.Arrays; public class Selec ...
- 安装ionic出现node-sass无法下载的解决方法
解决方法: 修改C:\users\[用户名]下的.npmrc文件: registry=https://registry.npm.taobao.org sass-binary-site=https:// ...
- delphi之TDataset
最近遇到了很多问题,现在做一下总结. 字符串处理: 字符串相加 var S1, S2: String; begin S1 := Concat('A', 'B'); // 连接两个字符串,S1变量等于A ...
- AOP programming paradiag
AOP https://en.wikipedia.org/wiki/Aspect-oriented_programming Typically, an aspect is scattered or t ...
- Android四大核心组件之Service
实验内容 启动Service 绑定Service 与Service进行通信 实验要求 启动Service 绑定Service 与Service进行通信 实验步骤 Service概述 Service通常 ...
- 如何使用抓包工具fiddler对app进行接口分析
如果你还不知道什么是抓包,点我 如果你还不知道什么是http,点它 如果你想知道什么是fiddler 什么是接口测试 正文来了.安装fiddler后,打开界面,点击tools,找到如图的options ...