首页 > 其他分享 >线程同步机制的封装

线程同步机制的封装

时间:2023-02-25 15:11:52浏览次数:26  
标签:同步 封装 return cond mutex pthread 线程 sem bool

#ifndef LOCKER_H
#define LOCKER_H

#include <pthread.h>
#include <semaphore.h>
#include <exception>

// 封装信号量
class sem {
public:
    sem()
    {
        if (sem_init(&m_sem, 0, 0) != 0) {
            throw std::exception();
        }
    }
    ~sem()
    {
        sem_destroy(&m_sem);
    }
    bool wait()
    {
        return sem_wait(&m_sem) == 0;
    }
    bool post()
    {
        return sem_post(&m_sem) == 0;
    }
private:
    sem_t m_sem;
};

// 封装互斥锁
class locker {
public:
    locker()
    {
        if (pthread_mutex_init(&m_mutex, nullptr) != 0) {
            throw std::exception();
        }
    }
    ~locker()
    {
        pthread_mutex_destroy(&m_mutex);
    }
    bool lock()
    {
        return pthread_mutex_lock(&m_mutex) == 0;
    }
    bool unlock()
    {
        return pthread_mutex_unlock(&m_mutex) == 0;
    }
private:
    pthread_mutex_t m_mutex;
};

// 封装条件变量
class cond {
public:
    cond()
    {
        if (pthread_mutex_init(&m_mutex, nullptr) != 0) {
            throw std::exception();
        }
        if (pthread_cond_init(&m_cond, nullptr) != 0) {
            pthread_mutex_destroy(&m_mutex); // 构造函数出问题,立即释放已成功分配的资源
            throw std::exception();
        }
    }
    ~cond()
    {
        pthread_mutex_destroy(&m_mutex);
        pthread_cond_destroy(&m_cond);
    }
    bool wait()
    {
        int ret = 0;
        pthread_mutex_lock(&m_mutex);
        ret = pthread_cond_wait(&m_cond, &m_mutex);
        pthread_mutex_unlock(&m_mutex);
        return ret == 0;
    }
    bool signal()
    {
        return pthread_cond_signal(&m_cond) == 0;
    }
private:
    pthread_cond_t m_cond;
    pthread_mutex_t m_mutex;
};

#endif

标签:同步,封装,return,cond,mutex,pthread,线程,sem,bool
From: https://www.cnblogs.com/cong0221/p/17154459.html

相关文章

  • Java处理前端日期控制器传过来的开始时间和结束时间;程序、进程、线程、多线程是什么,为
    Java处理前端日期控制器传过来的开始时间和结束时间处理前端日期控制器传过来的开始时间和结束时间\这里其实前端可以处理的当然后台也是可以处理的总体用的方法就是JS......
  • 将采购商认证报告同步到供应商
    将采购商认证报告同步到供应商INSERTINTOmls_sup_cert_reportsup(id,--idreportData,--报告日期dr,--逻辑删除标记certStandards,--认证......
  • 【Java】ArrayList线程不安全的坑
    问题复现:使用Java的steam().paralleStream(),foreach()方法向ArrayList添加数据,导致ArrayList中出现空值,代码如下:publicstaticvoidmain(String[]args){......
  • Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?
    一、线程安全活跃态问题线程因为某件事情得不到执行1、活锁线程没有阻塞,但一直重复执行某个操作,并且失败重试1)例子在消息队列中,消费者没有正确a......
  • 【多线程与高并发】- 浅谈volatile
    浅谈volatile目录浅谈volatile简介JMM概述volatile的特性1、可见性举个例子总结2、无法保证原子性举个例子分析使用volatile对原子性测试使用锁的机制总结3、禁止指令重......
  • Redis:二、jedis线程池
    中间件---Redis@目录中间件---Redis前言一、什么是jedis二、使用步骤1.Jedis读写redis数据(案例)2.编码2.1设定业务方法:2.2设定线程类,模拟用户调用:2.3设计redis......
  • Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse
    【前言】作为中国的“Fivetran/Airbyte”,Tapdata是一个以低延迟数据移动为核心优势构建的现代数据平台,内置60+数据连接器,拥有稳定的实时采集和传输能力、秒级响应的......
  • 一文带你了解线程池原理
    一文带你了解线程池原理1.使用线程池的意义何在?​ 项目开发中,为了统一管理线程,并有效精准地进行排错,我们经常要求项目人员统一使用线程池去创建线程。因为我们是在受不......
  • mysql半同步
    什么是半同步复制所谓的半同步复制就是master主服务器每commit一个事务(简单来说就是做一个改变数据的操作),要确保slave从服务器接收完主服务器发送的binlog日志文件并写入......
  • Java多线程学习路线
    在学习之前,需要对线程的概念和多线程编程的常见问题有基本理解。1线程Thread(重要)Runnable(重要)Callable和FutureTask(重要)CompletableFuture2线程池ThreadPool......