关于Linux下的多线程
作者:网络转载 发布时间:[ 2014/2/24 10:44:28 ] 推荐标签:测试技术 开发 操作系统
注意
因为pthread并非Linux系统的默认库,而是POSIX线程库。在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显式链接该库。
$g++ main.cpp -lpthread -o main
$./main
二、pthread_join函数
函数声明
int pthread_join(pthread_t thread, void **retval);
参数说明
thread: 线程标识符,即线程ID,标识线程。
retval: 用户定义的指针,用来存储被等待线程的返回值。
描述
pthread_join函数,阻塞当前线程的执行,以等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的,新创建的线程默认是joinable的。
三、线程的两种状态:joinable(默认)和detached
joinable线程可以被其他线程回收,在被其他线程回收之前,它所占用的存储器资源并不被释放,而detached线程不能被其他线程回收,它占用的存储器资源由系统自动释放。
在默认情况下,线程是joinable的,只有当pthread_join函数返回时,创建的线程才算终止,才能释放自己占用的系统资源,而detached线程没有被其他线程等待,线程执行完毕立马释放系统资源。
设置线程状态的函数pthread_attr_setdetachstate,函数声明为pthread_attr_setdetachstate(pthread_attr_t* attr, int detachstate);其中第二个参数是可选的PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。
如果设置一个线程为分离线程,而这个线程运行又非常快,它很可能在pthread_create函数返回之前终止了,它终止以后可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程得到了错误的线程号。要避免这种情况可以采取一定的同步措施,简单的方法之一是可以在被创建的线程里调用pthread_cond_timewait函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程里常用的方法。但是注意不要使用诸如 wait 之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。
如果进程中的某个线程执行了pthread_detach(th),则th线程将处于DETACHED状态,这使得th线程在结束运行时自行释放所占用的内存资源,同时也无法由pthread_join()同步,pthread_detach()执行之后,对th请求pthread_join()将返回错误。
四、linux下多线程属性设置
attr的缺省属性值
pthread_attr_t attr;
初始化属性
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_init 成功完成后将返回0,其他任何返回值都表示出现了错误,并将返回对应的值。
|
销毁属性
使用 pthread_attr_destroy(&attr) 删除初始化期间分配的存储空间,属性对象将会无效,函数成功完成后将返回0,其他任何返回值都表示出现了错误,并将返回对应的值。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11