#include<iostream>
#include<thread>
#include<mutex>
using namespace std;
recursive_mutex re;
void task1()
{
            re.lock();
               cout << "处理任务1中..." << endl;
               std::this_thread::sleep_for(1s);
               re.unlock();
}
void task2()
{
            re.lock();
               cout << "处理任务2中..." << endl;
               std::this_thread::sleep_for(1s);
               re.unlock();
}
class ThreadBase
{
public:
        virtual void Start()
        {
               is_exit = false;
               th = std::thread(&ThreadBase::Main,this);
        }
        virtual void Stop()
        {
               is_exit = true;
               Wait();
        }
        virtual void Wait()
        {
               if (th.joinable())
               {
                       th.join();
               }
        }
        bool get_exit()
        {
               return is_exit;
        }
        virtual void Main() = 0;
        ThreadBase(int _i):i(_i) {}
        virtual ~ThreadBase() {}
        int i;
private:
        std::thread th;
        bool is_exit;
};
class MyThread:public ThreadBase
{
public:
        MyThread(int i):ThreadBase(i) {}
        ~MyThread() override {}
        void Main() override
        {
               for (;;)
               {
                       //如果不是可重入锁,那么得先开锁然后才能执行task1,否则会造成死锁
                       //但是如果开锁,也就是在一个线程执行任务时,另一个线程也进来了,如果另一个线程执行了一会就结束了,肯定会
                       //释放锁,而实际上线程一的任务还没执行完
                       re.lock();
                       cout << "线程" << i << "拿到了锁" << endl;
                       task1();
                       task2();
                       re.unlock();
                       std::this_thread::sleep_for(1ms);
               }
        }
};
int main(int argc,char* argv[])
{
               MyThread th_one(1);
               th_one.Start();
               th_one.Wait();
        
        getchar();
        return 0;
}

C++多线程之可重入锁的更多相关文章

  1. Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”. ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现 ...

  2. [Python 多线程] RLock可重入锁 (九)

    RLock 可重复锁,是线程相关的锁.同样是线程相关的还有threading.local. 线程A获得可重用锁,并可以多次成功获取,不会阻塞.最后要再线程A中和acquire次数相同的release. ...

  3. 【多线程】可重入锁 ReentrantLock

    java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能.而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也 ...

  4. “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. 多线程通信的两种方式? (可重入锁ReentrantLock和Object)

    (一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...

  6. Java多线程——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”. ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现 ...

  7. Java 多线程 重入锁

    作为关键字synchronized的替代品(或者说是增强版),重入锁是synchronized的功能扩展.在JDK 1.5的早期版本中,重入锁的性能远远好于synchronized,但从JDK 1.6 ...

  8. 40 多线程(十二)——ReentrantLock 可重入锁

    我们使用的synchronized加的锁是可以延续使用的,如下: public void test() { //第一次获得锁 synchronized(this) { while(true) { // ...

  9. 二、多线程基础-乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁

    1.10乐观锁_悲观锁_重入锁_读写锁_CAS无锁机制_自旋锁1)乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将 比较-设置 ...

随机推荐

  1. 五、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-聊天输入框的实现

    会话好友列表的实现 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展 ...

  2. 关于Spring MVC的问题

    一.SpringMVC的流程是什么? 1. 用户发送请求至前端控制器DispatcherServlet: 2. DispatcherServlet收到请求后,调用HandlerMapping处理器映射 ...

  3. springboot整合阿里云视频点播接口

    官方SDK文档地址: https://help.aliyun.com/document_detail/57756.html?spm=a2c4g.11186623.6.904.4e0d3bd9VbkIC ...

  4. es(elasticsearch)安装IK中文分词器

    IK压缩包下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.7.0,需要下载对应的版本 我也上传了 h ...

  5. c++设计模式概述之中介

    代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做. 1.概述 A.中介模式,主要对象有两类: 中介和用户,类比生活中的房产中介公司,中介手中掌握着用户的资料,当然,用户手中也有中介的联系方式. ...

  6. 【LeetCode】276. Paint Fence 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetco ...

  7. 【LeetCode】904. Fruit Into Baskets 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/fruit-in ...

  8. 【LeetCode】60. Permutation Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. 分布式(CAP)

    1. Consistency  ------->C---------->一致性[写操作之后的读操作,必须返回该值] 2. Availability-------->A-------- ...

  10. Pytorch 图片载入

    目录 载入图片和坐标 Transforms Compose transforms 数据集的迭代 import os import torch import pandas as pd from skim ...