上一次讲述了多线程编程,但是由于线程是共享内存空间和资源的,这就导致:在使用多线程的时候,对于共享资源的控制要做的很好。先上程序:

 #include <iostream>
#include <thread>
#include <chrono>
#include <mutex> using namespace std; mutex mtx; void fn1()
{
for (int i = ; i < ; i++)
{
mtx.lock();
cout << "线程" << this_thread::get_id() << ":" << "The thread1 is running !" << endl;
mtx.unlock();
}
} void fn2()
{
for (int i = ; i < ; i++)
{
mtx.lock();//锁住的是什么资源,什么时候加锁?
cout << "线程" << this_thread::get_id() << ":" << "The thread2 is running !" << endl;
mtx.unlock();
}
} int main()
{
thread t1(fn1);
thread t2(fn2);
t1.detach();//this_thread是否表示当前进行,而这里的当前进程是否是main函数所在进程
t2.detach();
this_thread::sleep_for(chrono::milliseconds());//sleep_for表示当前进行休眠一段时间,不与其他进程竞争CPU
cout << "主线程端口:" << this_thread::get_id() << endl;
getchar();
return ;
}

上面一段程序,在main进程中创建了两个子线程t1,t2。对各个子线程的cout输出流进行了加锁,完了又对锁进行了释放。

其结果如下:

可见:线程t1,t2是交替执行的(这是由CPU时间片轮换造成的?)。假如我们不对cout输出流加锁,我们看看代码:

 #include <iostream>
#include <thread>
#include <chrono>
#include <mutex> using namespace std; mutex mtx; void fn1()
{
for (int i = ; i < ; i++)
{
//mtx.lock();
cout << "线程" << this_thread::get_id() << ":" << "The thread1 is running !" << endl;
//mtx.unlock();
}
} void fn2()
{
for (int i = ; i < ; i++)
{
//mtx.lock();//锁住的是什么资源,什么时候加锁?
cout << "线程" << this_thread::get_id() << ":" << "The thread2 is running !" << endl;
//mtx.unlock();
}
} int main()
{
thread t1(fn1);
thread t2(fn2);
t1.detach();//this_thread是否表示当前进行,而这里的当前进程是否是main函数所在进程
t2.detach();
this_thread::sleep_for(chrono::milliseconds());//sleep_for表示当前进行休眠一段时间,不与其他进程竞争CPU
cout << "主线程端口:" << this_thread::get_id() << endl;
getchar();
return ;
}

(就是单纯的注释掉了加锁)。

结果如下:

可以看到,结果产生了紊乱,分析一下这个结果:

线程t1才执行了一点:刚输出完“线程”两个字,转到线程2执行了,接下来再输出了线程t1的内容(并不是跑回去执行线程t1),再去执行线程t1.

造成这种紊乱的原因是:

cout本质上是一个输出流对象,相当于一个公共接口,这个接口是一个公共资源。这里就涉及到了资源共享的问题!!!

所以要对cout这个共享资源加锁!!!这样等当前的输出流执行完,才会到下一个线程!!

c++多线程编程互斥锁初步的更多相关文章

  1. (转)Linux C 多线程编程----互斥锁与条件变量

    转:http://blog.csdn.net/xing_hao/article/details/6626223 一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1. 初始化: 在 ...

  2. C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】

    多线程编程之锁的使用[互斥锁(lock)和读写锁(ReadWriteLock)] http://blog.csdn.net/sqqyq/article/details/18651335 多线程程序写日 ...

  3. python 使用多线程进行并发编程/互斥锁的使用

    import threading import time """ python的thread模块是比较底层的模块,python的threading模块是对thread做了 ...

  4. 多线程之互斥锁(By C++)

    首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...

  5. 多线程、互斥锁、异步、GIL

    多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便被使用 from threading imp ...

  6. 多线程编程-- part5 锁的种类以及辨析

    java中的锁,可以分为同步锁和JUC包中的锁. 同步锁 通过synchronized关键字进行同步,实现对竞争资源的互斥访问的锁,. 原理:对于每一个对象,有且只有一个同步锁,在同一时间点,所有的线 ...

  7. C++11 多线程同步 互斥锁 条件变量

    在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...

  8. 并发编程---互斥锁---互斥锁与join的区别

    互斥锁 互斥锁:就是把多个进程并发,修改成一块共享数据的操作变成串行,保证是一个一个来修改的. 缺点:效率低,加锁过程复杂 优点:增加了安全性 from multiprocessing import ...

  9. Java 多线程编程(锁优化)

    转:https://mp.weixin.qq.com/s/lDuguEhuWiLY8ofBRy3tZA 并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问. 加锁会带来性 ...

随机推荐

  1. NFA和DFA的区别

      NFA DFA 初始状态 不唯一 唯一 弧上的标记 字(单字符字/ε) 字符(串) 转换关系 非确定 确定 对于每个NFA M都存在一个DFA M' 使得 L(M) = L(M')

  2. Go语言实现:【剑指offer】对称的二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. Go语言实现: 方法一:递归 / ...

  3. 阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...

  4. 《Head first设计模式》之适配器模式

    适配器模式将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 我们周围的适配器 如果你需要在欧洲国家使用美国制造的笔记本电脑,你可能需要使用一个交流电的适配器. 你知 ...

  5. PHP 中 new static 和 new self 的区别

            今天老大在公司 问了一下  new static  和 new self 的区别 公司十个程序 竟然没有一个回答上来 后面画面自补 ... 本屌丝回家后 就百度了解了下 这二者区别 : ...

  6. Mysql 升级重装后连接出错 Table \'performance_schema.session_variables\' doesn\'t exist

    升级重装后  连接出错 报这个错误 Table 'performance_schema.session_variables' doesn't exist   使用这个命令即可 [root@localh ...

  7. NAT 地址转换

    NAT功能        NAT不仅能解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机.1.宽带分享:这是 NAT 主机的最大功能.解决IP4地址短缺的问题 ...

  8. Samba搭建Linux和Windows文件共享服务

    一.Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享 ...

  9. Force removing ActivityRecord no saved state问题的原因分析

    关键字,crash Force removing ActivityRecord,app died, no saved state的原因 相机拍摄的过程中断电,拍了一张黑图 I/ActivityMana ...

  10. 珠峰-6-node

    1. js主线程是单线程的. 2. path.resolve 传('/')解析出一个绝对路径.