【Linux课程学习】:锁封装(Mutex)线程封装(Thread),this指针
发布时间 - 2025-04-17 00:00:00 点击率:次linux学习笔记: https://blog.csdn.net/djdjiejsn/category_12669243.html
前言:
下面关于锁的封装看看下面的:Lockguard的构造函数加锁,析构函数解锁,用起来很方便。
代码语言:javascript代码运行次数:0运行复制namespace MutexModule{ class Mutex { private: Mutex(const Mutex &) = delete; const Mutex &operator=(const Mutex &) = delete; public: Mutex() { int n = ::pthread_mutex_init(&_mutex, nullptr); (void)n; } void Lock() { int n = ::pthread_mutex_lock(&_mutex); (void)n; } void UnLock() { int n = ::pthread_mutex_unlock(&_mutex); (void)n; } pthread_mutex_t *LockPtr() { return &_mutex; } ~Mutex() { int n = ::pthread_mutex_destroy(&_mutex); (void)n; } private: pthread_mutex_t _mutex; }; class LockGuard { public: LockGuard(Mutex &mtx) : _mtx(mtx) { _mtx.Lock(); } ~LockGuard() { _mtx.UnLock(); } private: Mutex &_mtx; };}1.访问内部私有成员变量1.类中的static函数为什么不能直接访问内部成员变量?
因为默认没有传this指针。所以static函数参数中有this指针的时候,还是可以访问的,此时this(对象)指针不能省略。
2.外部函数不能访问私有成员?
没有默认传递this指针,没有访问权限。声明是类的友元函数的时候,也是可以访问的。
代码:
代码语言:javascript代码运行次数:0运行复制#includeusing namespace std;class Solution {public:Solution():_n(1111){}friend static void test(Solution* t);static void func(){}static void a(){//可以访问静态成员方法,访问权限给到了private// 就是没有默认传递this指针而已func();_m = 11;}static void b(Solution* t){//可以访问静态成员方法,访问权限给到了private// 就是没有默认传递this指针而已t->_n = 555;t->_m;t->func();}private:int _n;static int _m;};void test(Solution* t){//能访问是传递了Solution对象,是Solution类的友元//friend static void test(Solution*& t);t->_n = 222;}
表示线程的状态,NEW表示新的线程,还没有进行Start操作时的状态信息。
2.4.是否被分离:线程默认是没有被分离的,而且只有分离和没有被分离两种情况,bool类型。
代码语言:javascript代码运行次数:0运行复制void EnableDetach(){ //状态变为false,新的线程默认为true _joinable=false;}void Detach(){ EnableDetach(); //线程分离 pthread_detach(_tid);}2.5.线程名字为了区分不同的线程可以给线程取个名字。
名字可以取"thread-num"表示是第几个线程。
2.6.执行的方法:这里定义的是void(std::string name),返回值为void,参数是string的函数。
_name:
线程名字以"thread-num"来命名,表示第几个线程。所以定义一个static int num进行记录有多少个线程。但是这是临界资源,线程再创建线程,导致方式混乱。
_joinable:
_joinable默认是没有被分离的,所以是true。
_func:
_func是外部传进来要执行的方法。所以要有func_t 参数。
_status:
为新线程,状态为NEW。
_tid:
在线程创建的时候,传到pthread里面进行确定。
代码语言:javascript代码运行次数:0运行复制Thread(func_t func) :_pid(getpid()) ,_func(func) ,_joinable(true) ,_status(STATUS::NEW){ LockGuard lockguard(_lock); { _name="thread-"+std::to_string(num++); }}先判断是不是没有在RUNNING,如果在RUNNING就返回false。然后创建线程进行执行,状态修改。
代码语言:javascript代码运行次数:0运行复制static void* Routine(void* args){ Thread* t=static_cast(args); t->_status=STATUS::RUNNING; t->_func(t->Name()); return nullptr;}bool Start(){ if(_status!=STATUS::RUNNING) { int n=::pthread_create(&_tid,nullptr,Routine,this); if(n!=0) { //线程创建失败 return false;
} return true; } //已经在RUNNING了 return false;} 3.3Stop函数:代码语言:javascript代码运行次数:0运行复制bool Stop(){ //在运行的时候,才能cancle if(_status==STATUS::RUNNING) { _status=STATUS::STOP; int n=::pthread_cancel(_tid); if(n!=0) { return true; } } return true;}3.4Join函数,EnableJoin函数:
代码语言:javascript代码运行次数:0运行复制void EnableDetach(){//状态变为false_joinable = false;}bool Join(){//没有被分离才能joinif (_joinable){int n = ::pthread_join(_tid, nullptr);if (n != 0)return false;_status = STATUS::STOP;return true;}return false;}void Detach(){EnableDetach();//线程分离pthread_detach(_tid);}#pragma once #include#include #include #include #include #include #include #include #include "Mutex.hpp"namespace ThreadModule{ using namespace MutexModule; using func_t=std::function ; static int num=1; enum class STATUS { RUNNING=1, STOP, NEW //新的线程的状态 }; class Thread { private: //执行方法,routine惯例 static void* Routine(void* args) { Thread* t=static_cast (args); t->_status=STATUS::RUNNING; t->_func(t->Name()); return nullptr; } void EnableDetach() { //状态变为false _joinable=false; } public: Thread(func_t func) :_pid(getpid()) ,_func(func) ,_joinable(true) ,_status(STATUS::NEW) { LockGuard lockguard(_lock); { _name="thread-"+std::to_string(num++); } } bool Start() { if(_status!=STATUS::RUNNING) { int n=::pthread_create(&_tid,nullptr,Routine,this); if(n!=0) { //线程创建失败 return false; } return true; } //已经在RUNNING了 return false; } bool Stop() { //在运行的时候,才能cancle if(_status==STATUS::RUNNING) { _status=STATUS::STOP; int n=::pthread_cancel(_tid); if(n!=0) { return false; } return true; } return true; } bool Join() { //没有被分离才能join if(_joinable) { int n=::pthread_join(_tid,nullptr); if(n!=0) return false; _status=STATUS::STOP; return true; } return false; } void Detach() { EnableDetach(); //线程分离 pthread_detach(_tid); } std::string Name() {return _name;} bool JoinAble(){return _joinable;} ~Thread() { } private: std::string _name; //线程名字 pthread_t _tid; //线程tid pid_t _pid; //线程属于哪个进程pid STATUS _status; //线程的状态 bool _joinable; //是否被分离 func_t _func; //线程执行的方法 Mutex _lock; //锁进行保护 };}
Start
Stop
Join
EnableJoin
Name
JoinAble
# linux
# 为什么
# JavaScript
# html
# Static
# String
# 封装
# 成员变量
# 构造函数
# 析构函数
# bool
# int
# void
# 指针
# 线程
# Thread
# 对象
# this
# https
# 几个
# 访问权限
# 的是
# 这是
# 还没有
# 要有
# 两种
# 中有
# 很方便
# 值为
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
敲碗10年!Mac系列传将迎来「触控与联网」双革新
如何快速登录WAP自助建站平台?
python中快速进行多个字符替换的方法小结
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
如何确保FTP站点访问权限与数据传输安全?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Android仿QQ列表左滑删除操作
实例解析Array和String方法
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Java遍历集合的三种方式
西安专业网站制作公司有哪些,陕西省建行官方网站?
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
浅谈javascript alert和confirm的美化
Laravel如何为API生成Swagger或OpenAPI文档
如何用AWS免费套餐快速搭建高效网站?
如何实现建站之星域名转发设置?
如何基于云服务器快速搭建个人网站?
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Laravel中的Facade(门面)到底是什么原理
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Laravel如何处理异常和错误?(Handler示例)
如何快速生成ASP一键建站模板并优化安全性?
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
青岛网站建设如何选择本地服务器?
PHP 500报错的快速解决方法
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
高防服务器如何保障网站安全无虞?
如何用虚拟主机快速搭建网站?详细步骤解析
jQuery 常见小例汇总
网站制作软件免费下载安装,有哪些免费下载的软件网站?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
如何在阿里云虚拟服务器快速搭建网站?
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
如何快速搭建高效简练网站?
Python面向对象测试方法_mock解析【教程】
详解Huffman编码算法之Java实现
活动邀请函制作网站有哪些,活动邀请函文案?
如何在服务器上配置二级域名建站?
如何彻底卸载建站之星软件?
java获取注册ip实例
移动端脚本框架Hammer.js
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】


} return true; } //已经在RUNNING了 return false;}