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

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

  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 下的多线程编程的更多相关文章

  1. 【转】 Linux下的多线程编程

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...

  2. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  3. 【转】Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  4. 《转》Linux下的多线程编程

    原地址:http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程 ...

  5. 【转】Linux下的多线程编程背景知识

    1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...

  6. Linux 下的多线程编程(1)

    #include<stdio.h> #include<pthread.h> #include<string.h> #include<sys/time.h> ...

  7. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

  8. Linux C++的多线程编程(转)

    1. 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(proces ...

  9. Linux C语言多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

随机推荐

  1. Excel表格中汉字转拼音

    一.使用“实用汉字转拼音V4.8” 软件 下载地址http://www.orsoon.com/soft/4413.html 或则百度 很多的 二.Excel自定义函数方法: 1.启动Excel 200 ...

  2. Object-c的一些基本概念

    自学了一个多月的IOS,对Object-C也有了初步的认识,也有很多观点不知道是否正确,所以整理了一下,和小伙伴们分享分享 1.OC中使用的消息机制代替调用方法 区别:使用消息结构的语言,其运行时缩引 ...

  3. mysql之数据库特性认识

    最近面试经常被面试官问道关于数据库方面的知识,于是总结一下面试官问的题以及自己对数据库的认识 1.之前百度面试官问了我一个特别基础的sql问题:如何清除表的所有记录,以前在学校做项目开发的时候有使用过 ...

  4. 堆分配与栈分配---SAP C++电面(5)/FEI

    一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢?为了说明这个问题,我们先来看一下内存内部的组织情况. 从上 ...

  5. OSCache缓存框架介绍

          OSCache是一种开放性的JSP定制标记应用,由OpenSymphony设计,提供了在现有JSP页面之内实现快速内存缓冲的功能. OSCache是个一个广泛采用的高性能的J2EE缓存框架 ...

  6. SnappyDB—Android上的NoSQL数据库简介

    参考:http://www.open-open.com/lib/view/open1420816891937.html 参考:http://android-arsenal.com/details/1/ ...

  7. JAVA并发,经典死锁案例-哲学家就餐

    转自:http://blog.csdn.net/tayanxunhua/article/details/38691005 死锁经典案例:哲学家就餐. 这个案例会导致死锁. 通过修改<Java编程 ...

  8. 基于视觉信息的网页分块算法(VIPS) - yysdsyl的专栏 - 博客频道 - CSDN.NET

    基于视觉信息的网页分块算法(VIPS) - yysdsyl的专栏 - 博客频道 - CSDN.NET 于视觉信息的网页分块算法(VIPS) 2012-07-29 15:22 1233人阅读 评论(1) ...

  9. 求高手帮忙解决一下问题Java Web Cookie实例

    package cn.com; import java.io.IOException; import java.io.PrintWriter; import java.util.LinkedHashM ...

  10. JAVA訪问URL

    JAVA訪问URL: package Test; import java.io.BufferedReader; import java.io.IOException; import java.io.I ...