线程控制

线程控制

1. 线程限制
(1)Single UNIX Specification定义了一些与线程操相关的限制,这些限制增强了应用程序在不同操作系统之间的可移植性。例如,应用程序需要为他管理的每个文件创个建 4个线程,但是操作系统不允许创建这些所有的线程,这个时候就必须限制可并发管理的的文件数。
(2)简单的列举几种限制

PTHREAD_THREADS_MAX进程可以创建的最大线程数
PTHREAD_STACK_MIN一个线程的栈的可用的最小的字节数
PTHREAD_DESTRUCTOR_ITERATIONS线程退出时操作系统实现试图销线程特定数据的最大次数
PTHREAD_KEYS_MAX-进程可以创建键的最大数目-

2. 线程属性
(1)pthrad接口允许我们通过设置每个对象关联的不同属性来细调线程和同步对象的行为。通常这些属性的函数都遵循相同的模式。
a.每个对象与它自己类型的属性对象进行关联(线程与线程属性关联,互斥量与互斥量属性关联);
b.有一个初始化函数,把属性设置为默认值;
c.还有一个销毁属性对象的函数,负责释放已经分配了与属性对象关联的资源;
d.每个属性都有一个设置属性值的函数,属性值作为参数按值传递;
e.每个属性都有一个从属性对象获取属性值的函数
(2)初始化与反初始化
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
(3)常见线程属性

detachstate线程的分离状态
guardsize线程栈末尾的警戒缓冲区大小(字节数)
stackaddr线程栈的最低地址
-stacksize-线程栈的最小长度

(4)如果对线程的退出状态不敢兴趣的话,可以使用pthread_detach()函数让操作系统在线程退出的时候回收他所占用的资源 ;同理也可以采取以下函数:
int pthread_attr_setdetachstate(pthread_attr_t *attr, int *detachstate)
可以把线程属性detach通过第二个参数设置成以下两个合法值:PTHREAD_CREATE_DETACH(分离状态启动线程)
PTHREAD_CREATE_JOINATE(正常状态启动线程)
int pthread_attr_getdetachstate(pthread_attr_t *restrict attr, int *detachstate)

3. 同步属性
简单的说明下,线程具有与之对应的属性,那么线程的同步也有相对的同步属性。具体的不详细展开叙述。介绍一个概念,如果说一个函数在相同的时间点可以被对个线程安全地调用,就称该函数是线程安全的。
4. 线程、信号
(1)每个线程都有自己的信号屏蔽字,但是信号的处理是所有线程共享的,这意味着单个线程可以阻止某些信号,但是当莫个线程修改了与某个给定信号相关的处理行为后,所有线程必须共享这个结果。进程的信号是传递给单个线程的,如果一个信号与硬件故障相关,那么该信号一般会被发送到引起该事件的线程里,而其他的信号则会被发送到任意一个线程。

信号屏蔽字一个进程中当前阻塞而不能够传递给该进程的信号集
信号集多个信号的集合,sigset_t类型

int pthread_sigmask(int how, const sigset_t *restrict set , sigset_t *resttrict oset)
阻塞信号发送
return: sucess 0 ,faile errorno
(1)set 为空,oset置为sigset_t类型的地址,来获取当前的信号屏蔽字,how会无任何意义;
(2)how取值

SIG_BLOCK把信号集添加到信号屏蔽字中
SIG_UNBLOCK从信号屏蔽字中移除信号集
SIG_SETMASK用信号集替换信号屏蔽字

int sigwait( const sigset_t *restrict set , int *restrict signop)
等待一个或者多个信号出现
ruturn sucess 0,fail errorno
使用前必须阻塞他正在等待的信号,sigwait会原子的取消信号集的阻塞状态,直到有新的信号被传递,再返回前,会恢复线程的信号屏蔽字,如果信号在sigwait之前没被阻塞,那么会出现一个时间窗,信号就可以被发送到线程
int pthread_kill(opthread_t thread , int signo);
把信号发送个线程,可以传一个0signo来检查线程是否存在。注意,闹钟定时器是进程资源,并且所有的线程共享相同的闹钟,所以,进程总的多个线程不可能不互相干扰的使用闹钟计时器。

线程控制其实还有很多内容都没有在文中介绍,比如线程的同步属性介绍、线程和fork、重入、取消选项等,本文只是介绍了本人常遇到的一些内容,如果有想继续了解的,可以查阅《UNIX环境高级编程》第十二章线程控制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值