[Linux C编程]多线程

多线程

1.进程与线程的区别:

1)进程是程序的一次执行,是资源分配的最小单位,线程可以理解为进程中执行的一段程序片段,是CPU调度的最小单位;

2)进程间是独立的,一个程序崩溃后,在保护模式下不会对其他进程产生影响。同一进程所产生的线程共享同一内存空间,一个线程挂掉会导致整个进程挂掉;

3)同一进程中两段代码不能同时执行,除非引入线程;、线程所占用的资源要少于进程所占用资源;

4)进程间可以通过IPC通信,但线程不可以。

2.多进程与多线程的区别:

 

3.线程与进程相比的优点?

1)和进程相比,多线程是一种非常“节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它的独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种“昂贵”的多任务工作方式

运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间.据统计,一个进程的开销大约是一个线程开销的30倍左右

2)线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便

3)使多CPU系统更加有效.操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上.

4)改善程序结构.一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改.

4.线程的操作

创建线程

等待线程结束

退出线程

(1)pthread_create

函数的作用:创建一个线程

函数的原型:int pthread_create(pthread_t * thread,const pthread_attr_t *attr,(void*)(*start_rtn)(void),void *arg)

函数的参数:thread:线程的标识符

        attr:线程的属性,一般设为NULL

        start_rtn:线程的执行函数

        arg:传入到线程执行函数的参数

返回值:成功:0  出错 < 0

(2)pthread_exit

函数的作用:终止调用线程

函数的原型:void pthread_exit(void * retval)

(3)pthread_join

函数的作用:阻塞调用线程,直到指定的线程终止

函数的原型:int pthread_join(pthread_t th,void ** thread_return)

函数的参数:th:线程的标识符

        thread_return:不为NULL时,存储线程结束时返回值

 

5.解决线程间对资源竞争的方法:

(1)互斥量Mutex

(2)信号灯Semaphore

(3)条件变量Conditions

 

6.线程的互斥

(1)互斥锁初始化

(2)获取互斥锁

(3)释放互斥锁

 

(1)pthread_mutex_init

函数的作用:初始化互斥锁

函数的原型:int pthread_mutex_init(pthread_mutex_t * mutex,const pthread_mutexaddr *attr)

函数的参数:mutex:互斥锁

返回值:成功:0,出错:-1

(2)pthread_mutex_lock、pthread_mutex_trylock、pthread_mutex_unlock、pthread_mutex_destorylock

函数的作用:对互斥锁上锁,判断上锁,解除锁,破坏锁

函数的原型:int pthread_mutex_lock(pthread_mutex_t *mutex)

        int pthread_mutex_trylock(pthread_mutex_t *mutex)

        int pthread_mutex_unlock(pthread_mutex_t *mutex)

        int pthread_mutex_destorylock(pthread_mutex_t *mutex)

返回值:成功:0,出错:-1

7.PV操作

(1)sem_init

函数的作用:初始化信号量

函数的原型:int sem_init(sem_t *sem,int pshared,unsigned int value)

函数的参数:sem:信号量指针

        pshared:0

        value:信号量的初始值

返回值:成功0,出错:-1

头文件:#include <semphore.h>

 

(2)信号量的PV操作,销毁

函数的原型:int sem_wait(sem_t *sem)   ——P

        int sem_trywait(sem_t *sem)

        int sem_post(sem_t *sem)   ——V

        int sem_getvalue(sem_t *sem)

        int sem_destroy(sem_t *sem)

函数的参数:sem:信号量指针

函数的返回值:成功 0,出错 -1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章