宏_REENTRANT的作用:
1)它会对部分函数重新定义他们的可安全重入的版本,这些函数的名字一般不会发生改变,只是会在函数名后面添加-r字符串。例如,函数名gethostbyname将变为gethostbyname_r。
2)stdio.h中原来以宏的形式实现的一些函数将变成可安全重入的函数。
3)在errno.h中定义的变量errno现在将成为一个函数调用,它能够以以多线程的方式获取正确的errno的值。
线程创建函数
#include<pthread.h>
int pthread_create(pthread_t* thread,pthread_attr_t *attr, void * (*start_func)(void *),void * arg);
函数创建成功的时候,会把线程标示符传入 thread,第二个参数指定线程的属性一般不需要去修改,第三个参数是线程的启动函数,第四个参数是线程启动函数的参数。
函数调用成果则返回0,失败返回错误码。
线程终止函数
#include<pthread.h>
void pthread_exit(void *)
该函数会终止调用它的线程并返回一个指向对象的指针。
线程收集函数
#include<pthread.h>
int pthread_join(pthread_t th,void ** thread_return);
第一个参数将要等待的线程,线程通过pthread_create返回的标示符即第一个参数来表示,第二个参数是一个指针,它指向另一个指针,而后者指向线程的返回值,函数调用成功返回0失败则返回错误码。
线程同步:
1 信号量
信号量的创建
#include<semaphore.h>
int sem_init(sem_t* sem,int pshared, unsigned int value)
这个函数初始化由sem指向的信号量对象,设置它的共享选项,并给一个初始的整数值,pshared参数控制信号量的类型,如果其值为0,表示这个信号量是当前进程的局部信号量,否则,这个信号量可以在多个进程之间共享。
接下来两个函数控制信号量的值
#include<semaphore.h>
int sem_wait(sem_t* sem);
int sem_post(sem_t * sem);
sem_post对信号量进行原子操作加1;
sem_wait对信号量减去1,只有当信号量是正数的时候才进行相减,然后进行执行,否则等待信号量变为正数。
信号量的销毁函数
#include<semaphore.h>
int sem_destroy(semt_t* sem);
释放信号量的资源,如果信号量被一些线程等待,则返回错误。
上面这些函数成功都返回0,失败返回相应的错误码
互斥量
#include<pthread.h>
int pthread_init(pthread_mutex_t *mutex, const pthread_mutexattrt_t *mutexattr);//互斥量的创建
int pthread_mutex_lock(pthread_mutext_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destory(pthread_mutex_t* mutex);
成功返回0,失败返回错误码;
互斥量的默认属性是fast,当该线程已经加锁过一个互斥量的时候,在进行加锁会阻塞,程序会进入死锁的状态,可以修改互斥量的属性,再构造的时候进行检测或者递归加锁,然后递归解锁。
线程的取消
#include<pthread.h>
int pthread_cancel(pthread_t thread);
线程收到取消的信号后,根据自己的属性进行处理,可以忽略,默认是取消。
设置线程的取消状态
#include<pthread.h>
int pthread_setcancelstate(int state, int*oldstate);
第一个参数PTHREAD_CANCEL_ENABLE接收取消;PTHREAD_CANCEL_DISABLE忽略取消。
设置取消类型
#include<pthread.h>
int pthread_setcanceltype(int type,int *oldstate);
type的两种取值:PTHREAD_CANCEL_ASYNCHRONOUS立即取消,另一种PTHREAD_CANCEL_DEFERRED等待线程执行到取消点。
默认的行为是PTHREAD_CANCEL_ENABLE,类型PTHREAD_CANCEL_DEFERRED。