多线程编程
原型:
#include <pthread.h>
int pthread_eaual(pthread_t tid1,pthread_t tid2); //判断两个线程ID是否相等
相等返回非0,不相等返回0.
#include <pthread.h>
pthread_t pthread_self(void); //获取自身线程ID
线程创建
#include <pthread.h>
int pthread_creat(pthread_t *restrict tidp, const pthread_attr_t *attr, void*(*start_rtn)(void), void *restrict arg); //创建线程
成功返回0,否则返回错误编号
tidp:指向的内存单元被设置为新创建的现成的线程ID
attr:用于定制线程的线程属性,设置为NULL时,则使用默认属性。
新创建的函数从strat_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg. 若想向strat_rtn传递不止一个参数,可以将多个参数放在一个结构体中,然后把结构体的地址作为arg参数传入。
线程终止
如果进程中的任一线程调用了exit, _Exit或_exit,则整个进程会终止。同样,如果信号的默认动作是终止进程,那么,把信号发送到进程会终止整个进程。
单个进程的退出方式有三种:
1.线程只是从启动的例程中退出,返回值是线程的终止码。
2.线程可以被统一进程中的其他线程取消。
3.线程调用 pthread_exit;
#include <pthread.h>
void pthread_join(pthread_t thread, void **rval_ptr); //成功返回0,否则返回错误编号。
pthread_join()函数,以阻塞的方式等待thread指定的线程调用pthread_exit、重新启动例程中返回
如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
thread: 线程标识符,即线程ID,标识唯一线程。rval_ptr: 用户定义的指针,用来存储被等待线程的返回值。
如果线程是从启动例程中返回,
rval_ptr将包含返回码,如果线程被取消,由rval_ptr指向的内存单元被置为PTHREAD_CANCELED。
线程同步
线程同步机制包括互斥,读写锁以及条件变量
互斥
可以把互斥变量之置为常量PTHREAD_MUTEX_INITIALIZER(针对静态分配的互斥量),或调用pthread_mutex_init函数进行初始化。如果动态的分配互斥量(如调用malloc函数),那么在释放内存前需要调用pthread_mutex_destory。
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destory(pthread_mutex_t mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);