pthread学习笔记

来源:互联网 发布:0信誉淘宝店铺 在哪买 编辑:程序博客网 时间:2024/06/01 10:02

pthread学习笔记

线程

线程的状态

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状态,则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。


从main函数返回后,进程终止,其它线程不能继续执行

当pthread_join()函数返回时,被连接的线程就已经被分离,再也不能连接该线程了。如果多个线程需要等待某个线程的结束,需要等待条件变量而不是jion函数,可以把结果保存到某个全局区域,并将条件变量广播给所有等待在其上的线程唤醒它们。


线程的生命周期

线程的生命周期分为:

就绪(Keady):线程能够运行,但是在等待可用的处理器。可能刚刚启动,或者刚刚从阻塞中恢复,或者被其它线程抢占。
运行(Kunning):线程正在运行。在多处理器系统中,可能有多个线程处于运行态。
阻塞(Blocked):线程由于等待"处理器"外的其它条件而无法运行,如:条件变量的改变,加锁互质量或者等待I/O操作结束。
终止(Terminated):线程从启动函数中返回,或者调用pthread_exit,或者被取消,终止自己并完成所有资源清理工作。不是被分离,也不是被连接,一旦被分离或者被连接,它就可以被回收。



互斥量

1.主要设计因素

1. 互斥量不是免费的,需要时间来家缩合解锁。锁住较少的互斥量的程序通常运行得更快。所以,互斥量应该尽量少,够用即可,每个互斥量保护的区域则应尽量大。
2. 互斥量的本质是串行执行。如果很多线程需要频繁地加锁同一个互斥量,则线程的大部分时间就会在灯带,这对性能是有害的。如果互斥量保护的数据(或代码)包含彼此无关的片段,则可以将大的互斥量分解为几个小的互斥量来提高性能。这样,任意时刻需要小互斥量的线程减少,线程等待的时间就会减少。所以,互斥量应该足够多(到有意义的地步),每个互斥量保护的区域则应尽量少。
3.上述两方面看似矛盾,但是这不是我们头一次遇到的情况。一旦当你理解了互斥量的性能后,就能正确处理它们。

2.互斥量死锁避免

1. 固定加锁层次:所有需要同时加锁互斥量A和互斥量B的代码,必须首先加锁互斥量A,然后加锁互斥量B(即固定加锁顺序)
2.试加锁和回退:在锁住某个几个中的第一个互斥量后,使用pthread_mutex_trylock来加锁集合中的其他互斥量,如果失败,则将集合中的所有已加锁互斥量释放,并重新加锁。
2.1 如果你使用“试锁和回退”算法,你应该总是以相反的顺序解锁互斥量。这样有利于减少线程(其它)做回退操作的可能性。

链锁

条件变量

1.等待的条件变量总是返回锁住的互斥量。
2.条件变量的作用是发信号,而不是互斥。
3.一个条件变量应该与一个谓词相关。4.原则:a)当你在多个谓词之间共享一个条件变量是,必须重视使用广播,而不是信号;        b)信号要比广播有效。5.应该将条件变量与相关的谓词“链接”在一起对待。6.一个条件变量只能与一个互斥量关联,一个互斥量可以和多个条件变量关联。7.在锁住相关的互斥量之后和在等待条件变量之前,测试谓词是很重要的;当线程醒来时,再次测试谓词同样重要,总是应该在循环中等待条件变量。8.线程从条件变量返回之前总是锁住互斥量,即使是等待超时。




原创粉丝点击