pthread笔记
还是推荐一个网页,另外我还读了UNIX环境高级编程中有关线程的部分,总体感觉多线程本身并没有什么太多的问题,互斥和条件变量可以很好地解决线程同步的问题,我在做试验的时候唯一遇到的问题只存在于执行顺序上,如果在写代码的时候比较注意的话应该没有什么太大的问题. 进入正题,pthread是实现POSIX标准的一个线程库,在Linux上编译的时候只要加上-lpthread的参数就OK了. 线程可以看作是一种轻量级的进程,都用来并发地执行一段指令流,只是线程之间能够很方便地共享内存.在上面那个网页中有一个通过pthread创建线程与通过fork创建进程的开销对比,可以明显地看出线程的轻量.线程的一个用处(也是我学习的主要原因)是避免大开销的I/O操作时不能高效利用CPU资源.使用pthread需要包含对应的库: #include <pthread.h> 创建线程使用pthread_create函数,定义如下: int pthread_create (pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void * (*start_rtn) (void), void *restrict arg); P.S. restrict修饰符 --> 传送门 第一个参数是创建的线程的线程ID,第二个参数用来设置线程属性(可以用NULL来代替使用默认属性),接下来两个参数是线程的入口函数地址和参数,注意线程的入口函数应该遵循如下的声明: void * func (void *arg); 线程可以用pthread_self(void)函数来获取自己的线程ID. 线程的终止可以是执行完毕所有指令之后自行终止,也可以显示地调用exit, _exit等函数来强制终止.正常地方法是使用pthread_exit函数来退出,见一下函数声明: void pthread_exit (void *rval_ptr); int pthread_join (pthread_t thread, void **rval_ptr); 第二个函数pthread_join可以阻塞其调用线程,知道thread指定的那个线程终止后才能继续,并且可以获得pthread_exit抛出的数据.该函数可以用来强制线程的执行顺序. 最后是两个线程同步的方法,互斥体(或称互斥量, Mutex)和条件变量(Condition Variable).两个概念都很简单,只是要求写代码的时候要注意,因为只要有一处没有调用对应的函数就可能导致整个程序的混乱.互斥体本质上是一种锁机制,也就是在获取或修改变量的时候要先加锁,完成操作后再进行解锁,但是锁本身并不绑定,相当于一种约定. 互斥体的类型都是pthread_mutex_t,比较简单的初始化方法是直接用常量PTHREAD_MUTEX_INITIALIZER赋值.另外也可以用pthread_mutex_init给互斥体附加一些属性,最后应当用pthread_mutex_destroy清理互斥体. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; [...]