Linux多线程编程

来源:互联网 发布:三星手机克隆软件 编辑:程序博客网 时间:2024/05/18 01:40

一、线程理论基础

1、进程:进程是一个具有一定功能的程序的一次运行活动,同时也是资源分配的最小单元。

2、进程是程序执行时的一个实例,即它是程序已经执行到某种程度的数据结构的汇集。

3、从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。

4、线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

     一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),

     线程与同属一个进程的其他的线程共享进程所拥有的全部资源。


二、进程与线程的区别:

1、"进程——资源分配的最小单位,线程——程序执行的最小单位"

2、进程有独立的地址空间           线程只是一个进程中的不同执行路径。(有自己的堆和桟,但没有地址空间)

3、多进程的程序要比多线程的程序健壮

4.进程切换时,耗费资源较大,效率要差一些。

   但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。


三、线程的优点

1、是一种非常“节俭”的多任务操作(启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段)

2、线程间彼此切换的时间短

3、线程间方便的通信机制。(进程有独立的数据空间,数据传递只能通过进程间通信,线程的数据可以直接为其它线程所用,这不仅快捷,而且方便  )

4、使多CPU系统更加有效.

5、改善程序结构


四、线程创建

#include <pthread.h>
int pthread_create(pthread_t * tidp,const pthread_attr_t*attr,void*(*start_rtn)(void),void*arg)

tidp:线程id
attr: 线程属性(通常为空)
start_rtn:线程要执行的函数
arg:start_rtn的参数

五、终止线程,退出线程,线程等待

程的正常退出方式有:
(1) 线程从启动例程中返回
(2) 线程可以被另一个进程终止
(3) 线程自己调用pthread_exit函数

#include <pthread.h>
void pthread_exit(void * rval_ptr)

功能:终止调用线程

Rval_ptr:线程退出返回值的指针

#include <pthread.h>
 int pthread_join(pthread_t tid,void **rval_ptr)


功能:阻塞调用线程,直到指定的线程终止。


Tid :等待退出的线程id


Rval_ptr:线程退出的返回值的指针


六、线程同步

1、法知道哪个线程会在哪个时候对共享资源进行操作,因此让如何保护共享资源变得复杂
       线程之间对资源的竞争:
       1 互斥量Mutex
       2 信号灯Semaphore
       3 条件变量Conditions

2 、互斥量

      互斥量从本质上说就是一把锁, 提供对共享资源的保护访问

      初始化    int pthread_mutex_init(pthread_mutex_t 、*mutex,const pthread_mutexattr_t *attr)

      加锁       int pthread_mutex_lock(pthread_mutex_t *mutex)

      解锁       nt pthread_mutex_unlock(pthread_mutex_t *mutex)

      销毁       pthread_mutex_destroy(pthread_mutex_t *mutex)

      
3、互斥量与信号量的区别

1、互斥量用于线程的互斥,信号量用于线程的同步

      互斥:某一资源同时只允许一个访问者对其进行访问       无法限制访问者对资源的访问顺序  无序

      同步: 通过其他机制 有序访问     多数情况下实现互斥      少数情况允许多个访问者同时访问资源


2、互斥量值只能为0/1,信号量值可以为非负整数

      一个互斥量    一个资源互斥访问 

       信号量    多个同类资源的多线程互斥和同步


3、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到



原创粉丝点击