`
konin
  • 浏览: 10198 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

异步互斥锁

阅读更多

什么情况下需要用到锁呢,就是多线程在使用同一个资源(变量),比如,在类A中有一个变量int i,A创建了3个线程,i作为变量传递给了这3个线程,每个线程都需要对这i进行修改,那么在使用 i 的时候,这3个线程都需要进行锁操作。

 

第一步 声明纯虚类:

class Lock {
public:
    /**
     * 析构函数
     */
    virtual ~Lock() {}
   
    /**
     * 加锁
     */
    virtual void acquire() = 0;
   
    /**
     * 尝试加锁
     * @return 加锁成功则返回true, 否则返回false
     */
    virtual bool tryAcquire() = 0;
   
    /**
     * 解锁
     */
    virtual void release() = 0;
};

 

第二步 声明 锁类,继承纯虚类

class Mutex : public Lock{
public:
    /**
     * 构造函数
     */
    Mutex();
   
    /**
     * 析构函数
     */
    virtual ~Mutex();
   
    /**
     * 加锁
     */
    virtual void acquire();
   
    /**
     * 尝试加锁
     * @return 加锁成功则返回true, 否则返回false
     */
    virtual bool tryAcquire();
   
    /**
     * 解锁
     */
    virtual void release();
   
private:
    /**
     * 声明友元
     */
    friend class Condition;
   
protected:

    pthread_mutex_t     _mutex;
};

 

实现:

Mutex::Mutex() {
    pthread_mutexattr_t attr;
    int rc = pthread_mutexattr_init(&attr);
    if (rc) {
        throw SynchException(rc);
    }

    rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
    if (rc) {
        throw SynchException(rc);
    }

    rc = pthread_mutex_init(&_mutex, &attr);
    if (rc) {
        throw SynchException(rc);
    }

    rc = pthread_mutexattr_destroy(&attr);
    if(rc != 0) {
        throw SynchException(rc);
    }
}

Mutex::~Mutex() {

    int rc = pthread_mutex_destroy(&_mutex);
    if (rc) {
        cerr << "Failed to destroy mutex: " << SynchException::toString(rc) << endl;
    }
}

void Mutex::acquire() {

    int rc = pthread_mutex_lock(&_mutex);
    if (rc) {
        throw SynchException(rc);
    }
}

bool Mutex::tryAcquire() {

    int rc = pthread_mutex_trylock(&_mutex);
    if (rc != 0 && rc != EBUSY) {
        throw SynchException(rc);
    }
    return rc == 0;
}

void Mutex::release() {
    int rc = pthread_mutex_unlock(&_mutex);
    if (rc) {
        throw SynchException(rc);
    }
}

0
1
分享到:
评论

相关推荐

    同步读锁,异步互斥写锁源码

    本主题将深入探讨“同步读锁”和“异步互斥写锁”的概念、实现原理以及源码分析,主要以`LockDemo`为例进行阐述。 首先,我们需要了解锁的基本类型:互斥锁(Mutex)和读写锁(Read-Write Lock)。互斥锁提供独占式...

    互斥锁的消息队列,很综合的程序源码

    在IT行业中,互斥锁(Mutex)和消息队列是两种关键的同步机制,它们在多线程编程和进程通信中发挥着重要作用。本程序源码综合运用了这些概念,结合了延时处理和容错处理,使得系统更加稳定和高效。 首先,互斥锁是...

    python互斥锁、加锁、同步机制、异步通信知识总结

    互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性。 采用f_flag的方法效率低 创建锁 mutex=threading.Lock() 锁定 mutex.acquire([blocking])#里面可以加blocking(等待的时间)或者...

    飓风内核项目大纲1

    异步互斥锁允许安全的资源访问,而基于管道的通信则提供了数据传输的途径,两者都是异步编程的重要组成部分。 6. **Rust语言的async/await语法**:Rust的这一特性使得编写异步代码变得简洁,编译器会自动生成Future...

    简单的JavaScript互斥锁分享

    上述互斥锁实现通过维护等待队列,允许开发者以顺序的方式执行异步操作,从而组织异步代码以类似于同步代码的结构。这种方式简化了异步逻辑的管理,使其更加直观。 知识点7:代码的可读性与维护性 通过将互斥锁的...

    JavaScript的互斥(mutex)对象。-JavaScript开发

    基于承诺的互斥锁允许顺序执行相同的异步操作。 一个典型的用例示例是检查资源是否存在,并作为原子异步操作读取/创建资源。 互斥(mutex)JavaScript的互斥(mutex)对象。 动机API配置用法示例图像服务器示例相关...

    await-lock:互斥锁用于异步功能

    等候锁 互斥锁用于异步功能用法import AwaitLock from 'await-lock' ;let lock = new AwaitLock ( ) ;async function runSerialTaskAsync ( ) { await lock . acquireAsync ( ) ; try { // IMPORTANT: Do not return...

    线程间同步机制 读写锁通信机制 线程与信号

    在Linux高级程序设计中,主要介绍了三种线程同步机制:互斥锁、条件变量和读写锁,以及线程与信号的交互。 1. **互斥锁通信机制**: 互斥锁是用于保护临界区的一种机制,确保同一时间只有一个线程能访问共享资源。...

    多线程编程指南

    **初始化互斥锁属性对象**:在使用互斥锁前,需要初始化互斥锁属性对象,设置互斥锁的行为特性。 **销毁互斥锁属性对象**:当互斥锁不再使用时,应销毁互斥锁属性对象,释放相关资源。 **设置互斥锁的范围**:互斥...

    mutex_writelog.tar.gz

    在给定的“mutex_writelog.tar.gz”压缩包中,包含了一个利用C语言编写的、带有互斥锁(mutex)的日志写入实现。这个实现确保了在多线程环境下日志记录的正确性和一致性。 首先,让我们深入理解“互斥锁”(Mutex)...

    async-mutex:用于同步Javascript异步工作流的互斥量

    它是什么? 该软件包实现了用于同步Javascript异步操作的原语。 互斥体 术语“互斥体”通常是指用于同步在不同线程上运行的并发进程的数据结构。... 锁定互斥锁将返回一个承诺,一旦互斥锁可用,该承

    多进程互斥读写XML文件

    多进程互斥读写XML文件是一个需要谨慎处理的问题,合理使用互斥锁或其他同步机制,结合操作系统提供的文件锁功能,可以有效地避免并发访问导致的数据错误。在实际开发中,还需要根据具体应用场景权衡性能和安全性,...

    嵌入式Linux高级编程--05posix_线程编程.ppt

    在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行访问。 互斥锁的操作主要包括以下几个步骤: 1. 互斥锁初始化:pthread_mutex_init 2. 互斥锁上锁:pthread_mutex_lock 3. 互斥锁...

    C#的多线程示例;几个多线程之间的互斥,同步;WPF主界面INVOKE

    本文将深入探讨C#中的多线程机制,包括线程互斥与同步,以及如何在WPF主界面中安全地更新UI。 首先,让我们理解什么是多线程。多线程是指一个应用程序内同时运行多个独立的执行线程。在C#中,可以使用`System....

    易语言多线程操作模块

    易语言多线程操作模块源码,多线程操作模块,时间_现行时间,互斥锁创建,互斥锁销毁,互斥锁锁定,互斥锁解锁,互斥锁异步锁定,线程启动,线程启动多参,线程创建扩展,线程销毁,线程退出,线程等待,线程强制结束,线程键创建,...

Global site tag (gtag.js) - Google Analytics