线程学习笔记2

         在两个进程间进行socket通信中,在其中一个进程中创建新的线程,用于监听,编程中发现自己对线程的操作仅限于线程的创建,销毁,以及互斥量的操作,感觉还有许多关于线程的东西没有掌握,so,需要好好学习总结一下,不足之处望指出!

         为什么要引入线程呢?

         虽然进程可以提高CPU的利用率,但是进程之间的切换是非常耗费资源和时间的,为了能更进一步的提高操作系统的并发进,引进了线程。这样,进程是分配资源的基本单位,而线程则是系统调度的基本单位。一个进程内部的线程可以共享该进程的所分配到的资源。线程的创建与撤消,线程之间的切换所占用的资源比进程要少很多,总的来说就是为了更进一步提高系统的并发性,提高CPU的利用率。

        

线程标识

         线程ID使用数据类型pthread_t表示,关于线程标识的函数有:

         (1)int pthread_equal(pthread_t tid1, pthread_t tid2); 比较两个线程ID,相等返回非0  ,不等返回0

(2)pthread_t pthread_self(); 获取线程自身的ID 。


线程的创建

int pthread_create(pthread_t  *tidp,const pthread_attr_t   *attr,void *(func)(),void arg); 成功返回0 ,错误返回错误编号。

第二个参数用于指定线程的属性,一般置为NULL 。


线程终止

线程退出的三种方式:

(1)从启动例程中返回,返回值是线程的退出码

(2)被同一进程中的其他线程取消

(3)线程调用pthread_exit函数退出

void pthread_exit(void *rval);线程退出,返回值(退出码)保存到rval中。

当线程需要使用某线程的退出码时,就会用到pthread_join()函数,该函数用于阻塞等待某线程的退出,并保存该线程的退出码到第二个参数中,当线程终止时,该函数将会回收该线程的资源,若成功返回0,函数原型如下:

int pthread_join(pthread_t thread,void ** rval);如果线程处于分离状态,该函数将不能用于等待该分离线程的结束。对于分离线程,没有被其他线程等待,运行完毕后,将自动释放系统资源。

线程如果想取消同一进程中的其他线程,需要使用pthread_cancel函数提出申请,仅仅是提出申请,函数原型为:

int pthread_cancel(pthread_t tid);


线程退出清理

当线程退出时,可以指定执行的函数,以完成清理工作,需要使用如下两个函数:

void pthread_cleanup_push(void (*fun)(void *),void *arg);

void pthread_cleanup_pop(int execute);

为执行退出清理函数,需要使用第一个函数注册退出需要执行的函数,由于使用栈,所以函数执行顺序与注册顺序相反。

使用第一个函数完成注册后,什么时候会调用注册的函数呢?

(1)当调用pthread_exit()函数时,会调用注册的函数完成清理工作;

(2)相应上面所说的取消请求时,会调用注册的函数完成清理工作;

(3)使用pthread_cleanup_pop函数时(参数必须为非0,才会调用清理函数,且push次数和pop次数相等),会调用注册的函数完成清理工作。

若注册了函数A和函数B,但是需要退出时,仅需执行A,可以使用pthread_cleanup_pop(0),将B弹出,然后在使用(1)、(2)或(3)调用清理函数。

注意:如果线程是使用return进行返回时,将不会调用其注册的清理函数。


线程同步

线程同步时线程的关键点,如何进行线程同步处理呢?

(1)互斥锁

使用数据类型pthread_mutex_t定义互斥量 mutex

使用函数int  pthread_mutex_init(&mutex,NULL),初始化互斥量

使用函数int  pthread_mutex_lock(&mutex);获取互斥量

使用函数int  pthread_mutex_unlock(&mutex);释放互斥量

使用函数int  pthread_mutex_destory(&mutex);销毁互斥量

使用函数int  pthread_mutex_lock(&mutex);为阻塞获取互斥锁,若非阻塞获取可使用函数int  pthread_mutex_trylock(&mutex);

(2)读写锁

使用数据类型pthread_rwlock_t定义读写锁rwlock

使用函数pthread_rwlock_init(&rwlock,NULL),初始化

使用函数pthread_rwlock_rdlock(&rwlock);获取读锁

使用函数pthread_rwlock_wrdlock(&rwlock);获取读写锁

使用函数pthread_rwlock_undlock(&rwlock);释放锁

使用函数pthread_rwlock_destory(&rwlock);销毁锁

(3)条件变量





未完成

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值