进程与线程

参考:http://0xffffff.org/2016/02/11/38-c++-concurrency/#%E4%BA%92%E6%96%A5%E9%94%81

特点:

  1.    线程并非越多越好,线程越多,CPU分配给每个线程的时间片就越少
  2. 每个线程都拥有一个独立的栈,errno也是属于单个线程的,每个线程中的errno是独立的。
  3. gcc在链接的时候需要增加-lpthread选项(pthread是共享库文件)。
  4. 线程终止
        --任一线程调用了exit函数,整个进程就会终止。
        --如果信号默认动作是终止进程,那么信号发送到该进程,整个进程也会被终止。
    单个线程通过以下三种方式退出
       --线程只是从启动函数中返回,返回值是线程的退出码
       --线程可以被同一进程中的其他线程取消。
       --线程调用pthread_exit。

实用:

  1. 在linux下每一个进程都一个进程id,类型pid_t,可以由getpid()获取。POSIX线程也有线程id,类型pthread_t,可以由pthread_self()获取,线程id由线程库维护。但是各个进程独立,所以会有不同进程中线程号相同节的情况。那么这样就会存在一个问题,我的进程p1中的线程pt1要与进程p2中的线程pt2通信怎么办,进程id不可以,线程id又可能重复,所以这里会有一个真实的线程id唯一标识,tid。glibc没有实现gettid的函数,所以我们可以通过linux下的系统调用syscall(SYS_gettid)来获得。

api注意事项:

  1. pthread_detach和pthread_join区别:

          前期准备知识:在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前

       它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

         pthread_join缺点:调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞。

         pthread_detach:不希望主线程阻塞的话用这个。将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。

     注:线程间同步除了互斥锁和条件变量外还有信号量,对信号量的理解:就是一个计数器,放在全局区域。进程间的信号量相当于把计数器放在了共享内存。

线程池:

           可参考:http://blog.jobbole.com/100842/

           结论:线程池有两个重要的东西:1:任务队列  2:线程队列。   任务队列必然是要暴露在多线程中的,所以对任务队列的push,pop要通过互斥锁来访问,还有一点就是当队列为空的时候,要等待主线程添加任务,添加任务之后要通知其他线程去处理,这是通过互斥锁+条件变量的方式搞定的。

          主线程添加任务,线程池去处理任务。

           实现:任务队列可用普通队列(线程安全的阻塞队列是关键,有push和pop就可以了,线程用vector保存就可以了

 

posted @ 2018-05-03 17:45  WorldsCollide  阅读(51)  评论(0)    收藏  举报