Linux下thread编程(三)

news/2024/5/18 23:54:25 标签: thread, linux, join, signal, kill, 编程

作者:Sam(甄峰) sam_cdoe@hotmail.com

1.创建thread.

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr,
              void *(*start_routine)(void*), void *restrict arg);

 

参数1:pthread_t *restrict thread:创建threadthread ID.

参数2:const pthread_attr_t *restrict attr:创建线程的属性。

参数3:void *(*start_routine)(void*):thread服务程序。

参数4:void *restrict arg:thread服务程序参数。

 

2. 等待目标线程终止:

pthread_join() 函数会一直阻塞调用线程,直到指定的线程终止。

指定的线程必须位于当前的进程中,而且不得是分离线程。所有创建时属性为PTHREAD_CREATE_JOINABLE的非分离thread. 最终都需要调用pthread_join() or pthread_detach() 。这样thread所占资源和 Thread ID 才被释放。

 

3. 分离thread:

int pthread_detach(pthread_t thread);

pthread_detach()指出当thread 结束时,thread所占资源和Thread ID会被释放和再利用。如果调用pthread_detach()时,thread没有结束,它并不会导致thread退出。它只对PTHREAD_CREATE_JOINABLE 非分离thread有效。

 

4. 获取thread ID:

pthread_t pthread_self(void);

返回调用threadthread ID.

 

5. 比较thread ID:

int pthread_equal(pthread_t t1, pthread_t t2);如果 tid1tid2 相等,pthread_equal() 将返回非零值,否则将返回

 

6. 向thread发信号:

int pthread_kill(pthread_t thread, int sig);

tid 所指定的线程必须与调用线程在同一个进程中。sig 参数必须来自 signal(5) 提供的列表。

 

7. 退出线程:

void pthread_exit(void *value_ptr);

pthread_exit()用来终止调用thread并置位value_ptr.这个值会交给pthread_join

 

 

Thread的取消:

同一进程内,某个Thread可以向其它thread发送取消要求,要求目标thread退出运行。

取消请求的处理方式取决于目标线程的状态。状态由以下两个函数确定:pthread_setcancelstate()pthread_setcanceltype()

 pthread_setcancelstate() 启用或禁用线程取消功能。创建线程时,缺省情况下线程取消功能处于启用状态。

pthread_setcanceltype() 可以将取消类型设置为延迟或异步模式。创建线程时,缺省情况下会将取消类型设置为延迟模式。在延迟模式下,只能在取消点取消线程。在异步模式下,可以在执行过程中的任意一点取消线程。因此建议不使用异步模式。

 

执行取消操作存在一定的危险。大多数危险都与完全恢复不变量和释放共享资源有关。取消线程时一定要格外小心,否则可能会使互斥保留为锁定状态,从而导致死锁。或者,已取消的线程可能保留已分配的内存区域,但是系统无法识别这一部分内存,从而无法释放它。

 

如果创建thread时使用缺省设置,则thread可以被取消,并为异步方式,所以向某一thread发送pthread_cancel()后,并不保证什么时候目标thread会被取消。只有当目标thread运行至取消点时才会真正退出。

 

类似Read,write等阻塞函数可以被看作取消点,但Sam记得并不能保证。所以建议使用手动添加取消点

pthread_testcancel();

当线程取消功能处于启用状态且取消类型设置为延迟模式时,pthread_testcancel() 函数有效。如果在取消功能处于禁用状态下调用 pthread_testcancel(),则该函数不起作用。

请务必仅在线程取消操作安全的序列中插入 pthread_testcancel()

kill">

http://www.niftyadmin.cn/n/1748462.html

相关文章

Mock/mockito单元测试,简单高效的单元测试

2019独角兽企业重金招聘Python工程师标准>>> mock是个轻量级的单元测试框架&#xff0c;做单元测试优点特别多&#xff0c;下边先来一段比较简单的实例 首先maven依赖的包有&#xff1a; <dependency><groupId>org.mockito</groupId><artifact…

MUTT+MSMTP利用163服务器发送邮件

监控系统发送告警邮件&#xff0c;我们自己搭建邮件服务器&#xff0c;成本较高&#xff0c;所以可以使用163等第三方MTA帮助我们发送。MUTTMSMTP是一个很好的选择&#xff0c;具体实现如下&#xff1a;tar -xvf msmtp-1.6.5.tar cd msmtp-1.6.5.tar 源码安装三板斧 ./configur…

QEMU 使用的镜像文件:qcow2 与 raw

本文介绍了 qcow2 和 raw&#xff0c;它们都是 QEMU(KVM)虚拟机使用的磁盘文件格式&#xff0c;本文将从其实现原理&#xff0c;支持特性&#xff0c;以及读写效率等进行对比和分析&#xff0c;最后还要介绍这两种格式的磁盘文件如何转化。qcow2 的基本原理qcow2 镜像格式是 QE…

Laravel 5.4 初试。 Migrate遇到的数据库问题

为什么80%的码农都做不了架构师&#xff1f;>>> 听说 Laravel 出 5.4 了&#xff0c;赶忙装一个新的试试手。 使用的是 Laravel 自带的安装器。 composer global install laravel/installer 然后 laravel new blog 喝杯茶就装好了。 之后配好数据库&#xff0c;执行…

傅里叶

http://blog.sina.com.cn/s/blog_bf1e123a0101e0h0.html http://mt.sohu.com/20160802/n462208469.shtml http://www.cnblogs.com/v-July-v/archive/2011/02/22/1983674.html 转载于:https://www.cnblogs.com/liding/p/6360944.html

vue2相关体系的学习

2019独角兽企业重金招聘Python工程师标准>>> vuevuex构建单页应用 用 Vuex 构建一个笔记应用 用vue搭建的一个应用 适合用来学习。 Vue2Vue-router2Vuex2做demo有感 vue新手入门demo vue2.0vue-routervuex Vue.js 快速入门 vue.js 2.0 基础学习笔记 osc用了requirej…

修改JAVA代码,需要重启Tomcat的原因

准确的说只有修改方法中的内容才不需要重启&#xff0c;因为tomcat中对于方法的调用是动态的&#xff0c;调用方法的时候&#xff0c;方法的内容才会被加载 新增成员变量&#xff0c;方法&#xff0c;或修改静态方法和静态变量、创建新的类 这些都是需要重启的&#xff0c;因为…

Navicat 提示Cannot create oci environment 解决方案

一直在使用 Navicat &#xff0c;这是一个数据库客户端软件&#xff0c;能连接多种不同类型的数据库&#xff0c;给我们的日常的工作带来了不少的便捷。当Navicat 就莫名其妙的不能连接 oracle 数据库了。总是提示如下错误&#xff1a; 先说下 OCI 是什么&#xff0c;百科上这…