随着你对编程的深入,多线程是一个免不了的话题,在这里就对多线程做一个比较详细的总结。

  首先摆在我们面前的就是什么是线程,以及为么会有这个东西。记得之前学习的时候自己会画一张很大的图,在图中可以详细的写出线程为什么会出现?他是为了解决什么问题才出现的?线程的出项肯定是针对进程的,那就看看它针对进程的那些特性进行了改进吧:

  1. 通过每种任务的类型,将各种任务分配给单独的线程,每个线程在处理任务的时候可以采用同步编程的方式

  2. 所有的线程都可以访问同一进程内的全局变量/文件描述符/heap memory等,这比多进程中的共享memory等方便很多

  3. 线程间的上下文切换和通信比进程间的上下文切换和通信快

  下面就来看看在Linux中多线程应该怎样使用吧

关于线程的创建:

  int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

注意的地方有两点:

  1. 新创建的线程从start_routine函数的地址开始执行,改函数只有一个void* 的参数,如果传入的参数不止一个的话需要将它们放到一个struct中,然后将这个结构体的地址作为参数传入。

  2. 虽然在phread_create 执行时会将thread指向的单元设置为子线程的thread_id,但由于线程调度是由操作系统完成的我们并不知道在子线程执行时thead指向的单元有没有被正常的初始化,如果在pthrea_create返回之前,子线程就开始执行了,这时候thread指向的单元还是一个不安全的值。这时候最明智的方法还是直接调用pthread_self来获取当前执行线程的pthead_id。

关于线程的退出:

  线程退出的方式有以下几种

    1>.线程从启动的返回,也就是线程的任务执行结束后

    2>.线程被同一进程中的其他线程取消

    3>.线程调用pthread_exit

    4>.整个进程结束

针对线程调用pthread_exit退出有一个注意点就是不能返回一个线程栈上的变量地址,因为该线程退出后线程栈就会被销毁。这点估计和函数返回一个局部变量的地址一样的危险。

  正如之前所说的,相对于进程,数据的共享等给线程带来了很多的好处。同时又引入了一个新问题就是对共享数据的访问控制。于是,为了解决这些数据的不一致提出了很多方法,互斥锁/读写锁/条件量。关于这三个的使用方法我觉得可以参照APUE第十一章的内容,里面的几个例子都感觉很经典。下面是一些学习时的笔记。

  1.有两种方式可以避免死锁,

    (1).控制上锁的顺序(保持多个线程上锁的顺序一致)

    (2).一直得不到某一把锁的时候先释放已持有的锁,然后过一段时间后重新尝试。

  2.关于锁的粒度

    锁的粒度太粗,这样会出现很多线程等待同一把锁,源自并发性能的改善就得不到充分的体验。锁的粒度太细,过多的锁开销会影响到程序的性能,而且代码会变得异常复杂。这里的平衡点只能靠我们在项目中的经验了。

最新文章

  1. Linux uniq常用命令
  2. C# 蓝牙编程
  3. vm导入后远程桌面无法登陆域账户
  4. iOS ASIHTTPRequest 使用指南
  5. Scala中的Map
  6. VMware 11安装Mac OS X 10.10
  7. BZOJ 2599 [IOI2011]Race【Tree,点分治】
  8. 在ubuntu linux 中编写一个自己的bash脚本
  9. jdbc3
  10. 201521123118《java程序与设计》第4周作业总结
  11. 数据分析之---Python可视化工具
  12. IDEA使用笔记(十)——设置Java方法注释
  13. getItemAt
  14. MongoDB 教程(七):插入文档、更新文档、删除文档
  15. [Leetcode 134]汽车加油站 Gas Station (环形)
  16. 【noip模拟赛6】收入计划 最大值的最小值 二分答案
  17. Ubuntu 下安装 Swoole
  18. 图像处理之生成ColorBar
  19. 【整理】HTML5游戏开发学习笔记(4)- 记忆力游戏
  20. CF1006C 【Three Parts of the Array】

热门文章

  1. Oracle包的概念
  2. Redis中各种方法的使用
  3. Linux下Apache重启遇到No space left on device错误的解决方法
  4. 利用 onload 事件监控跨站资源
  5. 几本不错的开源书(to be continued)
  6. html字符实体对照表
  7. 射频识别技术漫谈(28)——基于MF1射频卡的酒店门锁设计
  8. VC++或QT下 高精度 多媒体定时器
  9. perl 爬取同花顺数据
  10. Java图形化界面设计——布局管理器之GridLayout(网格布局)