0

0

【Linux课程学习】:锁封装(Mutex)线程封装(Thread),this指针

爱谁谁

爱谁谁

发布时间:2025-04-17 15:40:11

|

222人浏览过

|

来源于php中文网

原创

linux学习笔记: https://blog.csdn.net/djdjiejsn/category_12669243.html

前言:

下面关于锁的封装看看下面的:

Lockguard的构造函数加锁,析构函数解锁,用起来很方便。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">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;    };}</code>
1.访问内部私有成员变量

1.类中的static函数为什么不能直接访问内部成员变量?

因为默认没有传this指针。所以static函数参数中有this指针的时候,还是可以访问的,此时this(对象)指针不能省略。

2.外部函数不能访问私有成员?

没有默认传递this指针,没有访问权限。声明是类的友元函数的时候,也是可以访问的。

代码:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include <iostream>using 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;}</code>
【Linux课程学习】:锁封装(Mutex)线程封装(Thread),this指针

2.Thread成员变量:2.1.首先肯定是线程的tid:pthread_t _tid。2.2.进程的pid:pid_t _pid;。2.3.线程的状态:

表示线程的状态,NEW表示新的线程,还没有进行Start操作时的状态信息。

2.4.是否被分离:

线程默认是没有被分离的,而且只有分离和没有被分离两种情况,bool类型。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">void EnableDetach(){    //状态变为false,新的线程默认为true    _joinable=false;}void Detach(){    EnableDetach();    //线程分离    pthread_detach(_tid);}</code>
2.5.线程名字

为了区分不同的线程可以给线程取个名字。

名字可以取"thread-num"表示是第几个线程。

2.6.执行的方法:

这里定义的是void(std::string name),返回值为void,参数是string的函数。

【Linux课程学习】:锁封装(Mutex)线程封装(Thread),this指针

3.内部成员方法:3.1构造函数:

_name:

线程名字以"thread-num"来命名,表示第几个线程。所以定义一个static int num进行记录有多少个线程。但是这是临界资源,线程再创建线程,导致方式混乱。

_joinable:

ColorMagic
ColorMagic

AI调色板生成工具

下载

_joinable默认是没有被分离的,所以是true。

_func:

_func是外部传进来要执行的方法。所以要有func_t 参数。

_status:

为新线程,状态为NEW。

_tid:

在线程创建的时候,传到pthread里面进行确定。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">Thread(func_t func)       :_pid(getpid())       ,_func(func)       ,_joinable(true)       ,_status(STATUS::NEW){      LockGuard lockguard(_lock);      {       _name="thread-"+std::to_string(num++);        }}</code>
【Linux课程学习】:锁封装(Mutex)线程封装(Thread),this指针
3.2Start函数:

先判断是不是没有在RUNNING,如果在RUNNING就返回false。然后创建线程进行执行,状态修改。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">static void* Routine(void* args){     Thread* t=static_cast<Thread*>(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;}</code>
3.3Stop函数:代码语言:javascript代码运行次数:0运行复制
<code class="javascript">bool Stop(){    //在运行的时候,才能cancle    if(_status==STATUS::RUNNING)    {        _status=STATUS::STOP;        int n=::pthread_cancel(_tid);        if(n!=0)        {            return true;        }    }    return true;}</code>

3.4Join函数,EnableJoin函数:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">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);}</code>

4.整体代码:代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#pragma once #include <iostream>#include <cstdio>#include <string.h>#include <cstring>#include <pthread.h>#include <functional>#include <unistd.h>#include <sys/types.h>#include "Mutex.hpp"namespace ThreadModule{    using namespace MutexModule;    using func_t=std::function<void(std::string name)>;    static int num=1;    enum class STATUS    {        RUNNING=1,        STOP,        NEW     //新的线程的状态    };    class Thread    {    private:        //执行方法,routine惯例        static void* Routine(void* args)        {            Thread* t=static_cast<Thread*>(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;        //锁进行保护    };}</code>

Start

Stop

Join

EnableJoin

Name

JoinAble

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

611

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

134

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Pandas 教程
Pandas 教程

共15课时 | 1.2万人学习

AngularJS教程
AngularJS教程

共24课时 | 4.1万人学习

XML教程
XML教程

共142课时 | 8.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号