POSIX多线程API函数
创建
int pthread_create(pthread_t* tidp,const pthread_attr_t* attr,void* (*start_rtn)(void*), void* arg
)
tidp:事先创建好的pthread_t类型的参数。成功时tidp指向的内存单元被设置为新创建线程的线程ID。
attr:定义新线程的一些属性(配置项),包括线程栈[stack]、分离状态[detach state]等,大部分情况下默认值即可(NULL)
start_rtn:线程运行函数的地址,新创建的线程从start_rtn函数的地址开始运行
arg:start_rtn函数的参数。无参数时设为NULL即可。有参数时输入参数的地址。
如果调用成功,创建出一个新线程执行函数start_rtn(arg),线程号会被填入tidp,调用处收到返回值0,继续执行后续代码。如果调用失败返回非0错误码。
等待结束
int pthread_join(pthread_t tid, void** thread_return)
以阻塞的方式等待tid指定的线程结束,当函数返回时,被等待的线程资源被收回。如果线程已经结束,那么该函数会立即返回。
退出
一个线程可以通过以下3种方式结束:
- 在线程执行体内执行return语句
- pthread_exit():在线程函数中调用pthread_exit()来退出线程执行
- pthread_cancel(pthread_t tid):向一个线程发送一个取消请求。
发送信号
int pthread_kill(pthread_t threadId, int signal);
向线程发送一个信号。返回值:成功返回0,失败返回失败码。
获取线程ID
pthread_t pthread_self(void);
线程分离:
int pthread_detach(pthread_t tid);
返回值:成功返回0,失败返回错误号。
线程分离就是当线程被设置为分离状态后,线程结束时,它的资源会被系统自动的回收,而不再需要在其它线程中对其进行 pthread_join() 操作。
为什么线程分离
在我们使用默认属性创建一个线程的时候,线程是 joinable 的。 joinable 状态的线程,必须在另一个线程中使用 pthread_join() 等待其结束,如果一个 joinable 的线程在结束后,没有使用 pthread_join() 进行操作,这个线程就会变成”僵尸线程”。每个僵尸线程都会消耗一些系统资源,当有太多的僵尸线程的时候,可能会导致创建线程失败。
一个简单的例子:
void* worker(void* arg) {//do somethingreturn (void*)ret;
} int main(int argc, char* argv[]) {pthread_t tid; if (pthread_create(&tid, NULL, worker, &task) != 0) {return -1; } void* ret; pthread_join(tid, &ret); return (int)ret;
}
POSIX多线程API函数相关推荐
- POSIX信号量API函数
头文件:semaphore.h 初始化: int sem_init(sem_t *sem, int pshared, unsigned int value); sem_init() 初始化一个信号量, ...
- 基于API函数的串口通信(方法讲解)
用到的串口通信编程方法有:使用通信控件.在高级语言中嵌入汇编以及使用API函数.在这几种方法中,使用API函数编写的串口通信程序最为高效.灵活.串口通信编程将用到三种API函数 --串口通信相关API ...
- 标准C函数库头文件、POSIX标准库头文件和Windows API函数库头文件说明
1. 标准C函数库头文件 名字 源自 描述 <assert.h> 包含断言宏,被用来在程序的调试版本中帮助检测逻辑错误以及其他类型的bug. <complex.h> C99 一 ...
- posix多线程有感--API
一.头文件 #include <pthread.h> 二.编译选项 -lpthread 三.结构体 pthread_t pthread_attr_t pthread_barrier_t p ...
- 用Debug函数实现API函数的跟踪
用Debug函数实现API函数的跟踪 如果我们能自己编写一个类似调试器的功能,这个调试器需要实现我们对于跟踪监视工具的要求,即自动记录输入输出参数,自动让目标进程继续运行.下面我们就来介绍在不知道函数 ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- 《POSIX多线程程序设计》读书笔记
<POSIX多线程程序设计>读书笔记 一. 概述 1. 一个UNIX进程可以理解为一个线程加上地址空间.文件描述符和其他数据: 2. 多个线程可以共享一个地址空间,而 ...
- Linux Qt使用POSIX多线程条件变量、互斥锁(量)
今天团建,但是文章也要写.酒要喝好,文要写美,方为我辈程序员的全才之路.嘎嘎 之前一直在看POSIX的多线程编程,上个周末结合自己的理解,写了一个基于Qt的用条件变量同步线程的例子.故此来和大家一起分 ...
- POSIX 线程清理函数
POSIX 多线程的 cleanup 函数 控制清理函数的函数有两个,一个是 pthread_cleanup_push(), 用来把清理函数压入栈中,另一个是 pthread_cleanup_pop( ...
最新文章
- 服务器网页500错误修复工具,HTTP500错误是什么?如何修复
- Service-policy 的出入(QOS)
- abap性能优化——利用凭证的number ranger提高abap程序性能
- 反转了!“只问了1个框架,就给了35K的Python岗”
- Android ListView的基本应用
- c2061 dword 语法错误_解决'PMIB_ICMP_EX':undeclared identifier
- mysql手册04_视图
- marlab中主成分得分怎么求_成考数学不可触碰的雷区和得分技巧(纯干货)
- img文件制作linux启动u盘,用syslinux制作简单U盘启动盘教程
- MyDiskTest v2.98-U盘扩容检测工具
- 宏脉系统怎么改服务器地址,宏脉系统使用手册大全.doc
- 三维文件格式 abc, glTF, fbx, obj, dae, stl, 3ds, ply,...
- 台式计算机加固态硬盘,台式机添加固态硬盘教程_台式主机固态硬盘怎么安装-win7之家...
- 股票做空是什么意思?股票做空和做多是什么意思?
- MacBook Pro安装homebrew
- oracle中的drm是什么文件,oracle RAC DRM基本概念
- a记录 mysql_[a]-和[a]相关的内容-阿里云开发者社区
- charles抓手机端的包(android手机)
- 微商如何通过喜马拉雅引流?首先要明白引流的目的是什么?
- mina 使用手记 1
热门文章
- 清华镜像源安装 NGboost XGboost Catboost
- 别再搜集面经啦!小夕教你斩下NLP算法岗offer!
- 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解
- 论文浅尝 | 基于图匹配神经网络的跨语言知识图对齐 (ACL 2019)
- 论文浅尝 | 基于图注意力的常识对话生成
- 阿里云开源EasyTransfer:业界首个面向NLP场景深度迁移学习框架
- 活用这23种图表,让你的数据分析胜人一筹 | 推荐收藏
- 【JavaWeb】HTML+CSS
- Python+Selenium基础篇之2-打开和关闭火狐浏览器
- mysql_crud