多线程的一些小记

  之前写过一些多线程程序,基本上都是线程竞争条件比较少或者说没有,所以基本上没有碰见过死锁以及其他情况,以至于我自以为多线程的使用也并没那么难。
  如之前我写过的一篇一个简单的生产者与消费者,那时候写得也不太好,大概是使用一个互斥量去保护物品队列的获取与生产,一个条件变量去判断队列是否为满或者空(以前是用两个,有些多余)。
  因为之前写的过于简单,没有思考到多线程多方面的资源竞争情况,所以今天来记录一下一些写多线程程序的时候需要注意的一些点吧。
  PS:因为目前没时间,不太好写代码来作例子,就直接写一些注意的点,后面再来补充

  1、注意竞争的资源是否存活,这里可以使用智能指针去解决部分问题。
  2、使用智能指针中的shared_ptr还是需要注意使用,比如原先一个shared_ptr指向一个对象,后面在其他的调用中不小心修改其指向导致原资源被释放之类的,以及循环使用。
  3、递归锁与非递归锁,C++thread默认的是非递归锁,所以在编写多线程程序的时候,要注意加锁的位置。
  4、当有多个对象且这些对象的访问都是具有互斥锁的情况下,为了避免死锁,必须使这些锁的上锁顺序相同(可以比较锁的地址大小来上锁)。
  5、编写多线程程序,需要良好的掌握临界区的长度(锁的区域)。
  6、pthread提供的线程库有线程自杀以及他杀的函数(pthread_exit、pthread_cancel),但是C++11中的thread并没有提供这些功能,这是因为任何从外部终止线程的做法和想法都是错的,因为强行终止会导致线程无法清理自己占用的资源,就比如已经持有的锁,容易导致死锁,如果非要终止这样的任务,可以把这类任务使用多进程,然后kill进程。
  7、pthread_once、pthread_key挺好用的。

你可能感兴趣的:(C++)