系统编程——线程

1.线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
2.一个进程由几个线程组成,线程与同属一个进程的其他的线程共享进程所拥有的全部资源。
3.进程——资源分配的最小单位,线程——程序执行的最小单位。
4.进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
5.线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
6.进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

线程的优点:
1.和进程相比,它是一种非常“节俭”的多任务操作方式.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,
建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。
2.线程间彼此切换所需的时间也远远小于进程间切换所需要的时间
3.线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,
这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,
所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便
4.使多CPU系统更加有效.操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上.
5.改善程序结构.一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改.


一、线程的创建:
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的参数

二、线程的终止
void pthread_exit(void * rval_ptr)

功能:终止调用线程
Rval_ptr:线程退出返回值的指针

三、进程的等待
int pthread_join(pthread_t tid,void **rval_ptr)

功能:和wait()一样,等待线程结束,回收线程资源。
阻塞调用线程,直到指定的线程终止。

Tid :等待退出的线程id

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

四、线程分离
pthread_detach(pthread_self());   
线程分离,线程运行结束后自动释放资源


线程同步的三种方式:互斥量,信号量,条件变量。

互斥量的创建销毁:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
int pthread_mutex_destroy(pthread_mutex_t *mutex)
加锁解锁
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)

条件变量初始化:
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) ;
条件变量的等待:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
条件遍历的唤醒:
int pthread_cond_signal(pthread_cond_t *cond);

猜你喜欢

转载自blog.csdn.net/sinat_39440759/article/details/81877428