zoukankan      html  css  js  c++  java
  • Linux 下的多线程编程

    Linux 下的多线程编程

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

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

      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.关于锁的粒度

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

     
     
    分类: Linux
  • 相关阅读:
    centos 7 nginx 安装
    搭建Nuget.Server push时,"Failed to process request. 'Method Not Allowed'"
    Failed to create prime the NuGet cache
    Centos 7 安装 Visual stdio Code
    diskpart 格式化u盘 制作u盘启动盘方法
    sql server 2012 数据库日志文件过大,怎么缩小?
    浏览器同源政策及其规避方法
    redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
    php的闭包
    hash一致性算法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3282319.html
Copyright © 2011-2022 走看看