一种多线程变量区域锁的实现方法

多线程变量区域锁类定义

//写锁定义
typedef boost::shared_mutex Lock;
typedef boost::unique_lock<Lock> WriteLock;
typedef boost::shared_lock<Lock> ReadLock;
// 区域互斥锁类定义
class CVariableLock
{
public:
    CVariableLock(Lock *lock, bool *lock_flag);
    ~CVariableLock(void);
public:
    bool GetLockStatus();//获取资源状态,1——可访问,0——不可访问
private:
    Lock *m_lock;
    bool *m_lock_flag;
    bool m_get_lock_flag;
};

// 区域互斥锁构造函数
CVariableLock::CVariableLock(Lock *lock, bool *lock_flag)
{
    m_get_lock_flag = false;
    if(lock){
        m_lock = lock;
    }
    else{
        m_lock = NULL;
    }
    if(lock_flag){
        m_lock_flag = lock_flag;
    }
    else{
        m_lock_flag = NULL;
    }
}
// 区域互斥锁析构函数
CVariableLock::~CVariableLock(void)
{
    if(!m_lock || !m_lock_flag){
        return;
    }
    if(m_get_lock_flag){//只有在获取锁成功情况下才重置变量
    WriteLock w_lock(*m_lock);
        *m_lock_flag = false;
    }
}
// 区域互斥锁锁状态成员函数
bool CVariableLock::GetLockStatus(){//获取资源状态,返回结果:1——可访问,0——不可访问
    if(!m_lock  || !m_lock_flag){
         return true;
    }
    bool lock_status = true;
    {
        {
            ReadLock w_lock(*m_lock);
            lock_status = *m_lock_flag;
        }
        int count = 50;
        while(lock_status){
            if(count <= 0){
                break;
            }
            {
                ReadLock w_lock(*m_lock);
                lock_status = *m_lock_flag;
            }
            count--;
            Sleep(10);//延时10ms
        }
    }

    bool result = ~(lock_status);
    if(result){//获取锁成功
        {
            WriteLock w_lock(*m_lock);
            lock_status = *m_lock_flag;//再次读取变量值
            if(lock_status){//已被其他线程锁定
                m_get_lock_flag = false;
                result = false;
            }
            else{
                m_get_lock_flag = true;
                *m_lock_flag = true;
            }
        }
    }
    else{//获取锁失败
        m_get_lock_flag = false;
    }
    return result;
}

变量区域锁工作流程图

使用示例

// 区域互斥锁使用示例
bool lock_flag = false;
Lock rw_lock;
void Fun1()
{
    CVariableLock lock(&lock_flag, &rw_lock);
    if(!lock.GetLockStatus()){//获取锁失败
        return;
    }
    //获取锁成功,锁定区域1
    ……
}
void Fun2()
{
    CVariableLock lock(&lock_flag, &rw_lock);
    if(!lock.GetLockStatus()){//获取锁失败
        return;
    }
    //获取锁成功,锁定区域2
    ……
}
时间: 2024-10-14 10:41:08

一种多线程变量区域锁的实现方法的相关文章

java 多线程8 : synchronized锁机制 之 方法锁

脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的.注意这里 局部变量是不存在脏读的情况 多线程线程实例变量非线程安全 看一段代码: public class ThreadDomain13 { private int num = 0; public void addNum(String userName) { try { if ("

iOS四种多线程(swift和oc)

在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园.OK,let's begin! 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方案,他们分别是: Pthreads

Java多线程---同步与锁

一,线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 二.同步和锁定 1.锁的原理 Java中每个对象都有一个内置锁. 当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步. 当程序运行到synchronized同步方法或代码块时该对象锁才起作用. 一个对象只有一个锁.所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回

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

java中的锁,可以分为同步锁和JUC包中的锁. 同步锁 通过synchronized关键字进行同步,实现对竞争资源的互斥访问的锁,. 原理:对于每一个对象,有且只有一个同步锁,在同一时间点,所有的线程中有且只有一个能获取该同步锁,获取到同步锁的就可以被CPU进行调度,其他线程必须等待,直到获取到同步锁之后才能继续运行,这就是多线程通过同步锁进行同步的原理. JUC包中的锁:java.util.concurrent 功能更强大,使用当然更复杂. JUC包中锁,包括:lock接口,readWrit

ios中的几种多线程实现

iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa operations;3, Grand Central Dispatch (GCD) (iOS4 才开始支持)下面简要说明这三种不同范式:Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间,它

Java多线程系列--“JUC锁”05之 非公平锁

获取非公平锁(基于JDK1.7.0_40) 非公平锁和公平锁在获取锁的方法上,流程是一样的:它们的区别主要表现在"尝试获取锁的机制不同".简单点说,"公平锁"在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待):而"非公平锁"在每次尝试获取锁时,都是采用的非公平策略(无视等待队列,直接尝试获取锁,如果锁是空闲的,即可获取状态,则获取锁).在前面的"Java多线程系列--"JUC锁"03之 公平锁(一)&q

Java多线程系列--“JUC锁”03之 公平锁(一)

基本概念 本章,我们会讲解"线程获取公平锁"的原理:在讲解之前,需要了解几个基本概念.后面的内容,都是基于这些概念的:这些概念可能比较枯燥,但从这些概念中,能窥见"java锁"的一些架构,这对我们了解锁是有帮助的.1. AQS -- 指AbstractQueuedSynchronizer类.    AQS是java中管理"锁"的抽象类,锁的许多公共方法都是在这个类中实现.AQS是独占锁(例如,ReentrantLock)和共享锁(例如,Semap

Linux多线程编程-互斥锁

互斥锁 多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量.POSIX互斥锁相关函数主要有以下5个: #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_destroy(pthread_mutex_t *mutex); int p

转 ios中的几种多线程实现 .

iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa operations;3, Grand Central Dispatch (GCD) (iOS4 才开始支持) 下面简要说明这三种不同范式:Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间,