谈到多线程,首先得说说引入线程的优点:
一、进程的创建或切换带来的开销包括自己的栈去数据区等一些信息的更替。必然的开销相对能共享数据的线程来说大的多。
二、资源共享性好,一定程度上提高了相应速度,即cpu的利用率提高了。
基于相对进程的有点,操作系统分离了cpu资源和资源的分享权,即让线程成为了轻量级的进程。
1. 线程的创建:pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
线程ID:pthread_t与pid_t一样为一个为非负整数,由于可移植性的问题系统不能将其视为整数处理,因此对于线程来说pthread_equal(pthread_t tid1,pthread tid2)才是用来 比较两个线程是否相等的方式若为0则不相等。也可以通过pthread_self(void )函数返回其自身的线程ID。
线程属性:pthread_attr_t 提供初始化此线程的属性,例如其分离状态属性,线程栈末尾的警戒缓冲区大小等等。置为NULL时表默认。
线程启动时执行的函数:传递一个函数地址在此,创建成功后的线程执行此函数。
传递给执行函数的参数:此参数不限于一个参数,因为可以通过传地址的方式将一系列的参数传递给函数。当然此处传递的是地址。
2.线程的终止:如果进程中的任意一个线程调用了exit,_exit或_Exit,那么整个进程就会终止。
单个线程可以通过一下三种方式退出,在不终止整个进程的情况下,停止他的控制流。
1)线程只是从启动例程中退出,返回值是线程的退出码。
2)线程可以被同一进程中的其它线程取消
3)线程调用pthread_exit。
void pthread_exit(void *rval_ptr)
rval_ptr 是一个无类型的指针,其他进程中的线程可以通过调用pthread_join访问到这个指针。
int pthread_join(pthread_t thread, void **rval_ptr)调用此函数的线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。