读书人

Linux系统编程学习札记(十二)线程1

发布时间: 2012-07-15 20:20:06 作者: rapoo

Linux系统编程学习笔记(十二)线程1
线程1:
线程和进程类似,但是线程之间能够共享更多的信息。一个进程中的所有线程可以共享进程文件描述符和内存。
有了多线程控制,我们可以把我们的程序设计成为在一个进程同时做多个任务,每一个线程做一个独立的任务,这种
方式可以有以下好处:
1、通过把每一个事件分配给一个线程处理,可以简化异步事件处理的代码。每一个线程可以用同步编程模型,而同步
编程要比异步编程简单的多。
2、多个进程需要使用复杂的机制来共享内存和文件描述符。而线程可以自动共享同一内存地址空间和文件描述符。
3、有一些问题可以划分以便提高这个程序的吞吐量。一个进程如果有多个任务,需要进行隐式的序列化任务,因为
只有一个线程控制。使用多线程控制,独立的任务可以将每个任务分配一个线程。
4、交互式的进程可以改善响应时间,通过使用多线程将I/O和程序其他部分分开实现处理。
多线程不光可以在多核系统中得到并行的优势,而且在单核系统中,也可以提高系统的吞吐量和响应时间,因为当一个线程
阻塞的时候,另一线程可以占有cpu执行。
线程有一些描述线程和执行环境的信息来表示它,包括线程ID,寄存器值的集合,栈,调度优先级和策略,信号的掩码,errno
变量以及线程特有的一些结构。进程中各个线程共享进程的程序执行文本,程序的全局变量、堆内存、栈和文件描述符。
1、线程标志:
和进程一样,每一个线程都有一个ID。和进程ID是全系统唯一不同,线程ID是在进程内唯一。进程id用pid_t类型来表示,是一个
非负的整数。线程ID由pthread_t数据类型代表,和进程一样实现可能为一个结构,所以把pthread_t类型当做一个整数是不具有可
移植性,所以也没有可移植的打印线程id的方法。这样也需要一个函数来比较两个线程的ID是否相同。


一个线程可以可以使用pthread_cancel来取消同一进程中的其他线程。
#include <pthread.h>struct msg {    struct msg *m_next;    /* ... more stuff here ... */};struct msg *workq;pthread_cond_t qready = PTHREAD_COND_INITIALIZER;   /*初始化条件变量*/pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;  /*初始化互斥量*/void process_msg(void){    struct msg *mp;     for (;;) {        pthread_mutex_lock(&qlock);     /*条件本身由互斥量保护*/        while (workq == NULL)           /*wait返回后要重新检查条件*/            pthread_cond_wait(&qready, &qlock);  /*wait期间释放互斥量,返回时再次锁住*/        mp = workq;        workq = mp->m_next;        pthread_mutex_unlock(&qlock);   /*真正释放互斥量*/        /* now process the message mp */    }}void enqueue_msg(struct msg *mp){    pthread_mutex_lock(&qlock);       /*修改条件前锁住互斥量*/    mp->m_next = workq;    workq = mp;    pthread_mutex_unlock(&qlock);    pthread_cond_signal(&qready);     /*唤醒等待线程时不需要占有互斥量*/                                     /*如果希望在wait返回时不用再检查条件,就需要在唤醒时占有互斥量*/}

参考:
《Advanced programming in Unix Environment 2ed》第11章
1 楼 zhu_jinlong 2010-05-14 博主写得好!继续写下去!

读书人网 >编程

热点推荐