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种方式结束:

  1. 在线程执行体内执行return语句
  2. pthread_exit():在线程函数中调用pthread_exit()来退出线程执行
  3. 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; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中分割字符串两种方法正则分组别名_Python 正则表达式(分组)

正则表达式分组分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组。从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是&#xff…

SpringMVC核心——视图渲染(包含视图解析)问题

一、本来想说的是返回值处理问题,但在 SpringMVC 中,返回值处理问题的核心就是视图渲染。所以这里标题叫视图渲染问题。 本来想在上一篇文章中对视图解析进行说明的,但是通过源码发现,它应该算到视图渲染中,所以在这篇…

国际机器人联合会:全球工业机器人2019报告

来源:资本实验室据国际机器人联合会(IFR)最新发布的《全球机器人2019——工业机器人》报告数据,2018年全球工业机器人出货量42.2万台,比上年增长6%;年销售额达到165亿美元,创下新纪录。 IFR预测…

POSIX互斥锁api函数

初始化互斥锁 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr); 参数attr指定了新建互斥锁的属性。如果参数attr为NULL,则使用默认的互斥锁属性。 锁定互斥锁 int pthread_mutex_lock(pthread_mutex_t *mutex); 当 pthread_…

mediarecorder添加时间戳_Python脚本实现数据处理(官方实例)和Hive自带时间函数...

官网示例官网地址:https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-ApacheWeblogData下载数据wget http://files.grouplens.org/datasets/movielens/ml-100k.zip我们下载好数据安装unzip yum install -y unzip解压数据创建库创建表…

从空城计到阿尔法狗,博弈论如何渗透我们的生活?

来源:返朴2016年,有那么一只“狗”大闹天宫,这在整个人类社会引起了轩然大波。它就是阿尔法狗(AlphaGo),是谷歌(Google)旗下公司DeepMind 在人工智能与博弈论交叉研究上的一个杰作。…

POSIX条件变量API函数

初始化条件变量 int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *attr); 返回值:函数成功返回0;任何其他返回值都表示错误 初始化一个条件变量。当参数attr为空指针时,函数创建的是一个缺省的条件变量。 阻塞 in…

阶段性思考

算上在学校,学习前端已经两年了,但水平依旧不高,至今都只愿意钻研布局和交互,把兼容和动效玩得哈皮,但其实依旧没有装逼的自信。 也不得不回到当初的那个思考,如果只是做网页,又何必弄前端&…

反弹式木马原理_汽车避震器的原理与改装问题

一、避震器or避振器“震”字是指车轮在路面的滚动过程中,由于路面的不平,从路面传递上来的震动,而不是人为制造“振”动,所以使用“震”字更科学。二、避震器的工作原理避震器的工作原理是通过活塞运动产生阻尼力,将动…

科学探索奖首批50名获奖者都有谁?

来源:知识分子9月20日上午,经过四个多月的评审,2019年 获奖名单正式公布。来自全国26个科研单位、高校和企业的50位科学家成为首届“科学探索奖”获奖者,每人将在未来5年获得由腾讯基金会资助的300万元人民币。据悉,20…

python_递归原理

需要:  输出这样一些有规律数据: [0,1,1,2,3,5,8,13,21,34.......]看上面需要好像有一些规律,没错,就是大家熟悉的婓那波契数列,n(n-1)(n-2)如1385;运用递归原理得:def func(arg1,arg2): if arg1 0: print arg1,arg2 arg3 a…

POSIX信号量API函数

头文件:semaphore.h 初始化: int sem_init(sem_t *sem, int pshared, unsigned int value); sem_init() 初始化一个信号量,信号量对象为sem。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享,还是由…

untitled软件怎么用_苹果手机怎么用4G网络于App Store下载超过200MB以上的软件

近两年来,随着苹果中国市场份额被国产品牌挤占了不少,他们越来越懂得“聆听”中国用家的需要,其中一项便是用手机网络(4G)下载iOS应用。在这一点上我们中国人也不用再妄自菲薄了,在疯狂的4G建网以后,我们国家已经拥有全…

关于人脸识别的最全研究!

来源:北京物联网智能技术应用协会本文内容涵盖人脸识别发展历程、市场研究、核心技术、商业应用以及产业落地、个人看法等干货研究。注意,本文干货满满,约有2万7千字,强烈建议大家先收藏后学习!01 发展史1. 人脸识别的…

Stream学习过程中遇到的一个问题记录

Stream学习过程中遇到的一个问题记录 Test public void stream_modifiedV2(){List<String> strings Arrays.asList("aaa","bb","cc","dddddddddddddddddddddddddddddddd");Stream<String> stringStream strings.stream(…

C++ swap用法

swap用于交换两个元素的值 template<class T> void swap(T &a,T &b) {T c(a);ab;bc; } 例如交换两个int型变量的值&#xff1a; #include <iostream> using namespace std;int main() {int a1,b2;swap(a,b);cout<<a<<" "<<…

python table类中的 可以作为初步观察工具_Python程序设计基础_课程2020最新章节测试网课课后答案...

Python程序设计基础_课程2020最新章节测试网课课后答案更多相关问题科学探究的过程一般要经过______、作出假设、制定方案、实施方案&#xff0c;得出结论等五个步骤&#xff0e;在生物学研究中&#xff0c;当实验的结果与原有的知识发生矛盾时&#xff0c;应大胆地修正原有的知…

关于字节对齐以及内存占用

参考博文&#xff1a; http://www.javamex.com/tutorials/memory/object_memory_usage.shtml 本文主要考虑正常情况下一个对象在堆上的内存占用情况&#xff1a;对于下面的特殊情况不作讨论 1、某些情况下&#xff0c;JVM可能不会把对象存储在堆上&#xff1a;比如小的线程私有…

人工智能应用实践与趋势

来源&#xff1a;阿里云研究中心《崛起的超级智能》一书主要阐述当今天人类为人工智能的春天到来而兴奋&#xff0c;为人工智能是否超越人类而恐慌的时候&#xff0c;一个更为庞大、远超人类预期的智能形态正在崛起&#xff0c;种种迹象表明50年来&#xff0c;互联网正在从网状…

C++中set和map的erase用法

删除容器中值为 val 的元素 size_type erase (const value_type& val); 删除 it迭代器指向的元素 iterator erase (const_iterator it); 删除 [first,last) 区间内的所有元素 iterator erase (const_iterator first, const_iterator last);