一.pthread线程库
符合POSIX标准,portbale opeating system interface of UNIX。
pthread库分别支持linux、windows版本。
二.库函数
线程操作函数:
1.pthread_create():创建一个线程;
2.pthread_exit():终止当前线程;
3.pthread_self():获取当前线程的ID,常在线程函数内部调用。
每一个线程的返回值是void *,有两种方法返回:
1)return pointer;
2)pthread_exit((void*)pointer);
其它的线程通过int pthread_join(pthread_t pTid, void **thread_RETURN)函数获取线程pTid的返回值。
4.pthread_exit((void*)pointer)与int pthread_join(pthread_t pTid, void **thread_RETURN)的配合使用
调用pthread_join的线程会被阻塞,直至线程pTid结束,如果thread_RETURN!=NULL,线程pTid的返回码pointer返回至*thread_RETURN中。
5.int pthread_detach (pthread_t pTid);
将线程pTid的状态设置为分离状态(detached),该线程在运行结束后会自动释放该线程所占有的资源。
将子线程设置为分离状态,有两种方式:
1)父线程调用pthread_detach ( pTid),将子线程pTid设为detached状态;
2)子线程将自己设置为detached状态:pthread_detach(pthread_self()) 。
同步函数:
1.互斥锁mutex,互斥变量
初始化互斥变量:pthread_mutex_init(&mutex, NULL);
加锁:pthread_mutex_lock(&mutex);
解锁:pthread_mutex_unlock(&mutex);
销毁互斥变量:pthread_mutex_destroy(&mutex);
互斥锁在同一时刻只能被进程中的一个线程所使用。如果调用pthread_mutex_lock(&mutex)的线程发现mutex已经被上锁了,该线程会被阻塞,直至锁mutex被释放。
2.条件变量
pthread_cond_init():初始化条件变量
pthread_cond_destroy():销毁条件变量pthread_cond_wait(): 等待条件变量的特殊条件发生;
注:pthread_cond_wait()通常与互斥锁配合使用,pthread_cond_wait()会阻塞调用该函数的线程,线程阻塞前回自动解除互斥变量,直至被唤醒后,重新获得锁并继续执行。
pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程 。
3.关于死锁的解决方法
void
pthread_cleanup_push(
void
(*routine)(
void
*), void
*arg);
void
pthread_cleanup_pop(
int
execute);
在一个线程结束的时候,会自动执行一个clean-up函数柄,这个函数柄里有一个stack(栈),之前就通过pthread_cleanup_push往这个栈里压入了一个函数,我们压入很多个,然后退出的时候,clean-up函数柄会自动的从这些栈里拿出函数进行执行。
如果此函数没有异常退出,那这些栈的函数怎么办呢?我们可以通过phread_cleanup_pop弹出这些栈里的函数,注意,此时的参数要为0,如果非0的话,弹出的同时也会执行这些函数的。
pthread_cleanup_push(pthread_mutex_unlock, (
void
*) &mutex);
pthread_mutex_lock(&mutex);
/* do some work */
pthread_mutex_unlock(&mutex);
pthread_cleanup_pop(0);
4.关于
int
pthread_cancel(pthread_t
thread
);
向线程thread发送终止信号,成功为0,否则非0。发送成功并不意味这线程会终止。
线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。
5.
int
pthread_kill()
该函数可以测试线程是否存在。