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

 #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. 用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据

    1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...

  2. Python中zip()函数的解释和可视化

    zip()的作用 先看一下语法: zip(iter1 [,iter2 [...]]) -> zip object Python的内置help()模块提供了一个简短但又有些令人困惑的解释: 返回一 ...

  3. Generator - Python 生成器

    Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...

  4. Spring Boot 2.1.7 启动项目失败,报错: "Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured."

    一开始按照网上的很多解决办法是: 启动类头部声明@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}),但是这样会排除 ...

  5. 阿里云服务器ECS Ubuntu18.04 安装mysql

    ubuntu系统好了,这下我应该安装MySQL数据库了.在安装过程中,遇到好多坑,下面是我的安装过程. 1.在阿里云控制台,用vnc登录到服务器. 用新的用户登录到Ubuntu用户系统. 打开终端: ...

  6. 使用chrome控制台调试js代码

    1.打开控制台(空白页签即可) 2.将控制台在独立页打开(点击控制台右上角的三个点图标,然后点击如下图中的图标) 3.创建脚本编辑页面 4.页面区域说明 5.花键+回车之行代码 6.常用命令介绍 6. ...

  7. javascript Date对象 js全部的 时间属性 和 方法

    Date() 返回当日的日期和时间. getTime() 返回 1970 年 1 月 1 日至今的毫秒数. getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31).天 getDa ...

  8. gcc, ld

    GCC gcc除了具备基本的c文件编译功能外,还把其它工具的功能也集成了进来,比如as的汇编功能,ld的链接功能. 因此,gcc也可以通过-Wa, option,将option传给汇编器as:也可以通 ...

  9. iptables之路由网关共享上网/端口映射

    linux-A 主机配置eth0即可: [root@linux-A ~]# ifconfig eth0|sed -n '2p' inet addr:192.168.20.3 Bcast:192.168 ...

  10. Linux安装virtualenvwrapper

    1.pip install virtualenvwrapper 2.export WORKON_HOME=/home/virtualenv  //配置虚拟环境变量,以后直接mkvirtualenv 虚 ...