《UNIX 环境高级编程》学习笔记——线程控制

这篇博客详细介绍了UNIX环境下线程控制的各个方面,包括线程限制、线程属性、同步属性如互斥量、读写锁和条件变量的属性设置。文章还讨论了线程的重入、线程特定数据、取消选项、线程和信号、线程与fork的关系以及线程在I/O操作中的应用。对于理解和实现多线程编程提供了深入的见解。
摘要由CSDN通过智能技术生成

线程限制

限制名称 描述 name 参数
PTHREAD_DESTRUCTOR_ITERATIONS 线程退出系统时试图销毁线程特定数据最大次数 _SC_THREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX 进程可创建键的最大次数 _SC_THREAD_KEYS_MAX
PTHREAD_STACK_MIN 一个线程的栈可用的最小字节数 _SC_THREAD_STACK_MIN
PTHREAD_THREADS_MAX 进程可创建的最大线程数 _SC_THREAD_THREADS_MAX

线程属性

通常,管理这些属性的函数都遵循相同的模式。

  • 每个对象与它自己类型的属性对象进行关联(线程与线程属性关联,等等)。属性对象对应用程序不透明,有相应的函数来管理这些属性对象。
  • 有一个初始化函数,把属性设置为默认值。
  • 有一个销毁属性对象的函数。如初始化函数分配了与属性对象关联的资源,销毁函数负责释放这些资源。
  • 每个属性有一个从属性对象中获取属性值的函数。成功,返回0。失败,返回错误编号。
  • 每个属性有一个设置属性值的函数。属性值按值传递。
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
                             两个函数的返回值:若成功,返回0;否则,返回错误编号
名称 描述
detachstate 线程的分离状态属性
guardsize 线程栈末尾的警戒缓存区大小(字节数)
stackaddr 线程栈的最低地址
stacksize 线程栈的最小长度(字节数)

如果对现有的某个线程的终止状态不感兴趣的话,可使用pthread_detach让操作系统在线程退出时收回它所占用的资源。

如果在创建线程时不需要了解线程终止状态,可修改pthread_attr_t的detachstate属性,让线程一开始就处于分离状态。
可以使用pthread_attr_setdetachstate 函数把线程属性detachstate设为PTHREAD_CREATE_DETACHED,以分离启动线程。
或PTHREAD_CREATE_JOINABLE正常启动线程,应用程序可获取线程终止状态。

#include <pthread.h>
int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr,
	                            int* detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr,
	                            int *detachstate);
	                            两个函数的返回值:若成功,返回0;否则,返回错误编号

对遵循POSIX标准的系统,不一定要支持线程栈属性。
对遵循XSI选项的系统,需要支持。
可在编译阶段用_POSIX_THREAD_ATTR_STACKADDR和_POSIX_THREAD_ATTR_STACKSIZE来检查系统是否支持每个线程栈属性。

也可在运行阶段把_SC_THREAD_ATTR_STACKADDR和_SC_THREAD_ATTR_STACKSIZE传给sysconf。
可用pthread_attr_getstack和pthread_attr_setstack 对线程栈属性进行管理。

#include <pthread.h>
int pthread_attr_getstack(const pthread_attr_t *restrict attr,
						  void **restrict stackaddr,// 栈的最低内存地址。
						  size_t *restrict stacksize);
int pthread_attr_setstack(pthread_attr_t *attr,
						  void *stackaddr,
						  size_t stacksize);
						               两个函数的返回值:若成功,返回0;否则,返回错误编号
#include <pthread.h>
int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,
							  size_t *restrict stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr,
							  size_t stacksize);
							                两个函数的返回值:若成功,返回0;否则,返回错误编号

线程属性guardsize控制着线程栈末尾后用以避免栈溢出的扩展内存的大小。
属性默认值由具体实现定义,但常用值是系统页大小。

如果修改了线程属性stackaddr,系统就认为我们将自己管理栈,使警戒缓冲区机制无效,等同于把guardsize设为0。

#include <pthread.h>
int pthread_attr_getguardsize(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值