Linux下的多线程编程:原理、工具及应用(1)
🎬慕斯主页:修仙—别有洞天
♈️今日夜电波:Flower of Life—陽花
0:34━━━━━━️💟──────── 4:46
🔄 ◀️ ⏸ ▶️ ☰
💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍
目录
模拟语言封装Linux下多线程接口
线程互斥
前置知识
解释为什么会产生上述代码错误
如何解决?加锁!
什么是互斥锁?
pthread_mutex_t
pthread_mutex_init
PTHREAD_MUTEX_INITIALIZER
pthread_mutex_lock
pthread_mutex_unlock
pthread_mutex_trylock(不常用)
根据如上的互斥锁来进行操作
通过定义全局的锁
通过定义局部的锁(优雅的解决)
模拟语言封装Linux下多线程接口
#pragma once #include #include #include #include #include template using func_t = std::function; template class Thread { public: Thread(const std::string threadname,func_t func,T data) :_tid(0),_threadname(threadname),_isrunning(false),_func(func),_data(data) {} static void* ThreadRoutine(void* args) { Thread *ts=static_cast(args); ts->_func(ts->_data); return nullptr; } bool Start() { int n=pthread_create(&_tid,nullptr,ThreadRoutine,this); if(n==0) { _isrunning=true; return true; } return false; } bool Join() { if(!_isrunning) return true; int n=pthread_join(_tid,nullptr); if(n==0) { _isrunning=false; return true; } return false; } std::string ThreadName() { return _threadname; } bool Isrunning() { return _isrunning; } private: pthread_t _tid; std::string _threadname; bool _isrunning; func_t _func; T _data; };
其中成员变量存储了进程线程的ID、线程名、线程运行状态、线程运行的函数以及线程传递的变量。实现了线程的构造函数(根据线程名、传入函数以及传入变量构造),实现了开始运行的操作、等待线程的操作、判断是否运行以及返回线程名的操作。
重点说一下ThreadRoutine这个函数!他实现的是配合运行操作为pthread_create传递函数在执行完后return nullptr结束线程的操作!那他为啥要定义成如下的形式呢?
static void* ThreadRoutine(void* args) { Thread *ts=static_cast(args); ts->_func(ts->_data); return nullptr; }
这是因为成员函数是默认会带有this指针的,而我们要传入pthread_create中规定了只能传入void* args变量的函数。因此我们使用static让他不具有this指针!当然,这并不是唯一的解决办法,我们也可以将他定义到类外,然后给在类内声明友元函数即可。
线程互斥
我们根据上面所封装的线程库来叙写了如下的代码:
#include "Thread.hpp" std::string GetThreadName() { static int number = 1; char name[64]; snprintf(name, sizeof(name), "Thread-%d", number++); return name; } void Print(int num) { while (num) { std::cout
还没有评论,来说两句吧...