Linux:多线程编程
文章平均质量分 92
小栎
从事软件开发
展开
-
Linux线程简单介绍
1、进程与线程2、使用线程的理由3、有关线程操作的函数4、线程之间的互斥5、线程之间的同步6、试题最终代码1、进程与线程进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由原创 2015-09-16 16:33:01 · 429 阅读 · 0 评论 -
多线程程序中操作的原子性
多线程程序中操作的原子性0. 背景原子操作就是不可再分的操作。在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操作?1. 多线程环境下转载 2016-01-18 14:54:58 · 445 阅读 · 0 评论 -
一个Linux下C线程池的实现
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽 视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。 下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。转载 2015-09-23 17:28:14 · 640 阅读 · 0 评论 -
Linux线程同步之读写锁(rwlock)
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步,和互斥量不同的是:互斥量会把试图进入已保护的临界区的线程都阻塞;然而读写锁会视当前进入临界区的线程和请求进入临界区的线程的属性来判断是否允许线程进入。相对互斥量只有加锁和不加锁两种状态,读转载 2015-09-22 17:07:48 · 878 阅读 · 0 评论 -
Linux进程同步之记录锁(fcntl)
记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作。尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记录上锁往往更容易使用,且效率更高。记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区。对于这个功能阐述我认为有三点要解释的:记录锁不仅仅可以用来同步转载 2015-09-22 17:05:32 · 586 阅读 · 0 评论 -
进程信号的未决状态(pending status)
这两天看了apue有关进程信号的部分,觉得未决状态这个词很是不一般,呵呵。一开始当我看到这个词,我不理解,什么意思呢,读了好几遍。不知道是书里面讲的晦涩难懂,还是脑子越来越不行了,就是没有搞明白。后来看到后面的例子,然后再回想一下,终于清楚了!下面记录一下吧。定义:信号产生和传递之间的时间间隔内,称此信号是未决的;简单的说就是:一个已经产生的信号,但是还没有传递给任何进程,此时该信转载 2015-09-22 16:52:14 · 2417 阅读 · 0 评论 -
线程的分离状态(detached state)
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的。我们知道,进程中的线程可以调用:[cpp] view plaincopyprint?int pthread_join(pthread_t tid, void **rval_ptr); 来等待某个线程的终止,获得该线程的终止状态,转载 2015-09-22 16:55:03 · 1892 阅读 · 0 评论 -
线程的私有数据
一. 概念及作用 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。这就是线程存储的意义。这样的数据结构可以转载 2015-09-22 15:34:47 · 818 阅读 · 0 评论 -
Linux下线程同步的几种方法
Linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。一、互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码。 1. 初始化锁 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr); 其中参数 mut原创 2015-09-19 13:52:06 · 3840 阅读 · 0 评论 -
线程属性总结(二)
一.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。 名称:pthread_attr_init/pthread_attr_destroy转载 2015-09-22 14:43:09 · 387 阅读 · 0 评论 -
Linux线程属性总结(一)
线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中。[c] view plaincopy//线程属性结构如下: typedef struct { int etachstate; //线程的分离状态 int转载 2015-09-22 14:41:12 · 371 阅读 · 0 评论 -
POSIX多线程编程-条件变量pthread_cond_t
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线承间的同步。 1.转载 2015-09-21 09:33:36 · 899 阅读 · 0 评论 -
pthread_cleanup_push与pthread_cleanup_pop的理解
一、为什么会有pthread_cleanup_push与pthread_cleanup_pop:一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。转载 2015-09-19 15:45:51 · 1275 阅读 · 0 评论 -
信号量和共享内存
关于进程间的通信,有很多的方法可以实现。管道、FIFO、消息队列、信号量以及共享内存都可以提供进程间通信功能。本文主要介绍的内容是信号量以及共享内存的使用。 一、 几个概念理解信号量以及共享内存的概念以及学习对应的接口函数的使用,需要对标识符以及键等概念有所了解。下面我们逐一介绍以上概念。 标识符:在对文件进行读取和写入操作的时候,我们需要一个对应的原创 2015-09-19 14:11:45 · 1263 阅读 · 0 评论 -
并发编程系列之一:锁的意义
背景 C/C++语言的并发程序(Concurrent Programming)设计,一直是一个比较困难的话题。很多朋友都会尝试使用多线程编程,但是却很难保证自己所写的多线程程序的正确性。多线程程序,如果涉及到对共享资源的并发读写,就会产生资源争用(Data Race)。解决资源争用,最直接的想法是引入锁,对并发读写的数据进行保护(更高级的则包括无锁编程—— Lock Free转载 2016-01-18 15:40:40 · 3187 阅读 · 1 评论