【Linux】线程控制
创始人
2024-12-27 10:35:29
0

目录

创建线程

pthread_create

终止线程

pthread_exit

return 自动返回

等待线程

pthread_join


创建线程

pthread_create

参数:

thread:返回线程ID

attr:设置线程的属性,attr为NULL表示使用默认属性

start_routine:是个返回值和参数都为void*的函数的地址,线程启动后要执行的函数

arg:传给线程启动函数的参数返回值:成功返回0;失败返回对应的错误码

终止线程

如果一个进程中的线程掉执行时发生错误异常导致线程终止退出,比如解引用空指针、除0错误都会时线程异常终止,这会导致整个进程也随之终止!

如果需要只终止某个线程而不终止整个进程,可以有三种方法:1. 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。2. 线程可以调用pthread_ exit终止自己。 3. 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程。
pthread_exit

 参数:

注意:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。

return 自动返回

等待线程

线程等待和进程等待的目的基本是一样的!目的是:1.释放已经终止的线程的空间。2.得到线程的执行任务的情况即线程启动函数的返回值(一般通过该值判断线程执行任务的情况)。

pthread_join

 

参数:

retval:指向一个指针,即线程启动函数的返回值。

返回值:

成功返回0;失败返回对应的错误码

注意:使用pthread_join是阻塞等待线程。

在Linux中,这些控制线程的函数都在libpthread.so动态库中,因此链接这些线程函数库时要使用编译器命令的“-lpthread”选项。

代码如下:

#include  #include  #include  class Request { public:     Request(const char *str, int _cnt = 0)         : s(str), cnt(_cnt)     {     }     std::string Transform(int num)     {         std::string str = s + "-";         ++cnt;         return str + std::to_string(num);     } public:     std::string s;     int cnt; }; class Response { public:     Response(int _cnt = 0)         : cnt(_cnt)     {     } public:     int cnt; }; void *Routine(void *arg) {     Response *prs = new Response;     Request rq(static_cast(arg));     std::cout << "合并线程名称:" << rq.Transform(1);     if (rq.cnt > 0)         prs->cnt++;     return (void *)prs; } int main() {     pthread_t tid; // 新线程的用户级ID     void *retval;     pthread_create(&tid, nullptr, Routine, (void *)"thread");     pthread_join(tid, &retval); // 等待新线程并且获取线程启动函数的返回值     Response *ret = static_cast(retval);     if (ret->cnt > 0) // 根据新线程启动函数返回值判断该线程的任务完成情况     {         std::cout << "thread-1执行任务成功!" << std::endl;     }     delete ret;     return 0; } 

相关内容

热门资讯

逻辑思维游戏!微扑克全自动机器... 逻辑思维游戏!微扑克全自动机器人,wepower有辅助软件其实真的有挂;小薇(透视辅助)致您一封信;...
一起来讨论!随意玩有外挂吗(透... 一起来讨论!随意玩有外挂吗(透明挂)外挂透明挂辅助工具(2023已更新)(哔哩哔哩)1)随意玩有外挂...
六分钟了解!开心十三张吗,we... 六分钟了解!开心十三张吗,wepoker一贯真的是有挂,技巧教程(有挂插件)1、在开心十三张吗ai机...
一分钟了解!微乐家乡麻将挂(辅... 一分钟了解!微乐家乡麻将挂(辅助)其实是有挂(2021已更新)(哔哩哔哩)1、下载好微乐家乡麻将挂辅...
逻辑思维游戏!微扑克辅助器,w... 逻辑思维游戏!微扑克辅助器,wepower提高中牌率果然真的有挂1、让任何用户在无需微扑克辅助器AI...
玩家必用!喜扣跑胡子哪里有挂(... 玩家必用!喜扣跑胡子哪里有挂(透视辅助)透明挂透视辅助脚本(2021已更新)(哔哩哔哩)1、每一步都...
玩家必备教程!全来麻将有挂吗(... 玩家必备教程!全来麻将有挂吗(辅助)确实是有挂(2025已更新)(哔哩哔哩)1、全来麻将有挂吗系统规...
十分钟攻略!浙江茶苑游戏有外 ... 十分钟攻略!浙江茶苑游戏有外 挂吗,aAPOKER真是是真的有挂,教你攻略(有挂秘笈);1、浙江茶苑...
分享开挂内幕!八闽掌上麻将有挂... 分享开挂内幕!八闽掌上麻将有挂(辅助挂)透视脚本辅助脚本(2020已更新)(哔哩哔哩);1、许多玩家...
概率学逻辑思维!wepoke有... 概率学逻辑思维!wepoke有挂,we poke有挂其实真的有挂是一款可以让一直输的玩家,快速成为一...