2013年1月17日
摘要: 读写锁 (rwlock)功能特点简介读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。在读写锁保持期间也是抢占失效的。如果读写锁当前没有读者,也没有写者,那么写者可以立刻获得读写锁,否则它必须自旋在那里,直到没有任何写者或读者。如果读写锁没有写者,那么读者可以立即获得该读写锁,否则读 阅读全文
posted @ 2013-01-17 14:43 一个人的天空@ 阅读(2431) 评论(0) 推荐(0) 编辑
摘要: 9、多线程小结(2)3)合并线程:pthread_join int pthread_join(pthread_t* thread, void **ret); 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。关于什么是可joinable的线程,参见[3]。4)通过到斥实现线程同步(1)声明互斥锁变量:pthread_mutext_tmutex;pthread_mutex_t为不公开的数据类型,其中包含一个系统分配的属性对象。(2)互斥 阅读全文
posted @ 2013-01-17 14:36 一个人的天空@ 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 8、多线程小结(1)1、在Linux中,线程一般被认为是“轻量级的进程”。Linux创建进程所使用的函数是fork()或者vfork()。而对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs。2、使用fork()创建进程和使用POSIX线程库差别:使用fork()创建进程的特点:①代价昂贵,通常子进程需要拷贝父进程的整个上下文,比如数据等。②进程间的通信方式比较复杂,比如使用管道、消息、共享内存等方法。③操作系统在实现进程间的切换比线程切换更费时。使用POSIX pthreads库创建线程的特点:①线程可使用存在于进程中的资源,因此创建进程比创建线程更快。②线 阅读全文
posted @ 2013-01-17 14:31 一个人的天空@ 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 7、取消点的进一步讨论线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。(1)什么是线程取消点根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_con 阅读全文
posted @ 2013-01-17 14:15 一个人的天空@ 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 6、一个 pthread_cancel 引起的线程死锁【整理转载】说明:本文由【2,3】整理而得。这篇文章主要从一个 Linux下一个pthread_cancel函数引起的多线程死锁小例子出发来说明Linux系统对POSIX线程取消点的实现方式,以及如何避免因此产生的线程死锁。目 录:1.一个pthread_cancel引起的线程死锁小例子2.取消点(Cancellation Point)3.取消类型(Cancellation Type)4. Linux的取消点实现5.对示例函数进入死锁的解释6.如何避免因此产生的死锁7.结论8.参考文献1.一个pthread_cancel引起的线程死锁小例子 阅读全文
posted @ 2013-01-17 14:11 一个人的天空@ 阅读(324) 评论(0) 推荐(0) 编辑
摘要: pthread_cleanup_push/pthread_cleanup_pop() 以下内容根据【1】进行整理。关于取消点,将在后面进一步讨论。1、一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。2、线程终止时的清理不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特 阅读全文
posted @ 2013-01-17 13:55 一个人的天空@ 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 4、Linux多线程,线程同步(2)2)条件变量(cond) 利用线程间共享的全局变量进行同步的一种机制。条件变量上的基本操作有:触发条件(当条件变为true时);等待条件,挂起线程直到其他线程触发条件。int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);int pthread_cond_timewait(pthread_cond_t *cond,pthread_mu 阅读全文
posted @ 2013-01-17 13:48 一个人的天空@ 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 3、Linux多线程,线程同步5)线程私有数据进程内的所有线程共享进程的数据空间,因此全局变量为所有线程所共有。但有时线程也需要保存自己的私有数据,这时可以创建线程私有数据(Thread-specific Date)TSD来解决。在线程内部,私有数据可以被各个函数访问,但对其他线程是屏蔽的。例如我们常见的变量errno,它返回标准的出错信息。它显然不能是一个局部变量,几乎每个函数都应该可以调用它;但它又不能是一个全局变量,否则在A线程里输出的很可能是B线程的出错信息。要实现诸如此类的变量,我们就必须使用线程数据。我们为每个线程数据创建一个键,它和这个键相关联,在各个线程里,都使用这个键来指代线 阅读全文
posted @ 2013-01-17 13:29 一个人的天空@ 阅读(300) 评论(0) 推荐(0) 编辑
摘要: (2)线程的分离与结合在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。线程的分离状态决定一个线程以什么样的方式来终止自己。在上面的例子中,我们采用了线程的默认属性,即为非分离状态(即可结合的,joinable,需要回收),这种情况下,原有的线程等待创建的线程结束;只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离 阅读全文
posted @ 2013-01-17 12:04 一个人的天空@ 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 说明:以下内容,根据参考中【1~6】内容整理而得。一、基本概念1、线程是计算机中独立运行的最小单位。进程是分配资源的单位。2、为什么使用多线程?(1)启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右。(2)使用多线程的理由之二是线程间方便 阅读全文
posted @ 2013-01-17 11:50 一个人的天空@ 阅读(209) 评论(0) 推荐(0) 编辑