首页 > 开发 > linux > 正文

Linux中线程使用详解

2016-05-23 23:01:42  来源:极客头条
  Linux下多线程详解pdf文档下载:点击这里!
  Linux中线程和进程的区别http://blog.csdn.net/qq_21792169/article/details/50437304

  线程退出的条件:下面任意一个都可以。
  1.调用pthread_exit函数退出。
  2.其他线程调用pthread_cancel取消该线程,且该线程可被取消。
  3.创建线程的进程退出或者整个函数结束。
  4.当前线程代码执行完毕。
  5.其中的一个线程执行exec类函数执行新的代码,替换当前进程所有地址空间。
  当线程中休眠或者死循环时候,需要在住进程中调用pthread_join等待线程结束,死循环可以通过另外一个休眠的线程来结束,举例说明,让LCD显示摄像头数据,但是我们中途需要点击触摸屏来退出显示,视频显示是一个死循环来不停的读取视频数据,那么我们就可以创建两个线程,一个负责视频的不停读取,一个负责获取触摸屏数据,没有数据就休眠,当休眠被唤醒后就调用pthread_cancel取消死循环的线程,设计思路基本是这样。也可以采取进程实现这个操作。
  线程与进程
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。
    使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。
    使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。
    除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:
    1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
    2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
  3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
  一、线程标识
线程有ID, 但不是系统唯一, 而是进程环境中唯一有效.线程的句柄是pthread_t类型, 该类型不能作为整数处理, 而是一个结构.  下面介绍两个函数:
头文件: 原型: int pthread_equal(pthread_t tid1, pthread_t tid2);返回值: 相等返回非0, 不相等返回0.说明: 比较两个线程ID是否相等.头文件: 原型: pthread_t pthread_self();返回值: 返回调用线程的线程ID.  二、线程创建
  在执行中创建一个线程, 可以为该线程分配它需要做的工作(线程执行函数), 该线程共享进程的资源. 创建线程的函数pthread_create()
头文件: 原型: int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(start_rtn)(void), void *restrict arg);返回值: 成功则返回0, 否则返回错误编号.参数:tidp: 指向新创建线程ID的变量, 作为函数的输出.attr: 用于定制各种不同的线程属性, NULL为默认属性(见下).start_rtn: 函数指针, 为线程开始执行的函数名.该函数可以返回一个void *类型的返回值,而这个返回值也可以是其他类型,并由 pthread_join()获取arg: 函数的唯一无类型(void)指针参数, 如要传多个参数, 可以用结构封装.  linux下多线程程序的编译方法:
  因为pthread的库不是linux系统的库,所以在进行编译的时候要加上     -lpthread
         # gcc filename -lpthread  //默认情况下gcc使用c库,要使用额外的库要这样选择使用的库
  例:thread_create.c
  #include
  #include   //包线程要包含
  void *mythread1(void)
     int i;
     for(i=0;i