pthread库使用总结

一.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_tthread);

向线程thread发送终止信号,成功为0,否则非0。发送成功并不意味这线程会终止。

线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。 

5. int pthread_kill()

该函数可以测试线程是否存在。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值