Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108584
  • 博文数量: 26
  • 博客积分: 364
  • 博客等级: 一等列兵
  • 技术积分: 232
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-09 20:42
文章分类
文章存档

2012年(26)

分类: LINUX

2012-05-11 08:45:33

1. 线程的概念

我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用或者,本节我们学习如何在一个进程的地址空间中执行多个线程。有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形 界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务 都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程每个线程负责和一个网络主机通信。

以前我们讲过,main函数和信号处理函数是同一个进程地址空间中的多个控制流程,多线程也是如此,但是比信号处理函数更加灵活,信号处理函数的控制流程只是在信号递达时产生在处理完信号之后就结束,而多线程的控制流程可以长期并存,操 作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样。由于同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

  • 文件描述符表

  • 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)

  • 当前工作目录

  • 用户id和组id

但有些资源是每个线程各有一份的:

  • 线程id

  • 上下文,包括各种寄存器的值、程序计数器和栈指针

  • 栈空间

  • errno变量

  • 信号屏蔽字

  • 调度优先级

我们将要学习的线程库函数是由POSIX标准定义的,称为POSIX thread或者pthread。在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项

2. 线程控制

2.1. 创建线程
#include

int pthread_create(pthread_t *restrict thread,
 const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);

返回值:成功返回0,失败返回错误号。虽然每个线程也都有一个errno,但这是为了兼容其它函数接口而提供的,
pthread库本身并不使用它,通过返回值返回错误码更加清晰。



阅读(1407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~