• 武汉销毁220余台赌博机 民警:实为“电子老千” 2019-07-20
  • 山西拨付2.7亿元资金支持全省七大河流生态修复治理 2019-07-14
  • 龙游龙天红木小镇 让红木“活”着呈现东方美 2019-07-14
  • 食疗-热门标签-华商生活 2019-07-12
  • 评论:着力提升中小学教师优秀传统文化素养 2019-07-11
  • 深夜食堂?半夜吃东西真的好吗 2019-07-11
  • 乌鲁木齐举办端午戏曲交响音乐会 两团一院名角新秀齐亮相 2019-06-28
  • 房价炒成这个样子,还不准说,像话么? 2019-06-28
  • 蔡鄂生:传统金融、互联网金融都要“接地气” 2019-06-16
  • 报道新闻记录历史 70载人民日报见证中国发展大事 2019-06-16
  • 新书《薛兆丰经济学讲义》在网红菜市场发布 萝卜白菜变身艺术品 2019-06-10
  • “表面整改”“虚假整改” 2019-06-10
  • 嗯,这个有可能。符合系统性关连。 2019-05-30
  • 六问手机流量那些事:我的流量去哪儿了? 2019-05-21
  • 网络餐饮新规明年起实施 鼓励外卖使用安全无害包装盒 2019-05-21
  • 技术员联盟提供win764位系统下载,win10,win7,xp,装机纯净版,64位旗舰版,绿色软件,免费软件下载基地!

    当前位置:谁有一尾中特的网站 > 教程 > 服务器类 >

    最准的三连肖高手论坛:linux多线程编程详解教程

    来源:技术员联盟┆发布时间:2018-10-22 12:08┆点击:

    谁有一尾中特的网站 www.hwox.top 这篇文章主要介绍了linux多线程编程详解教程,提供线程通过信号量实现通信的代码,大家参考使用吧

    线程分类

     

    线程按照其调度者可以分为用户级线程和核心级线程两种。

     

    (1)用户级线程 

    用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持。在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建、调度、撤销等功能,而内核仍然仅对进程进行管理。如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程中的其他所有线程也同时被阻塞。这种用户级线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势。

     

    (2)核心级线程 

    这种线程允许不同进程中的线程按照同一相对优先调度方法进行调度,这样就可以发挥多处理器的并发优势。 

    现在大多数系统都采用用户级线程与核心级线程并存的方法。一个用户级线程可以对应一个或几个核心级线程,也就是“一对一”或“多对一”模型。这样既可满足多处理机系统的需要,也可以最大限度地减少调度开销。

     

    Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用clone()和fork(),最终都用不同的参数调用do_fork()核内API。当然,要想实现线程,没有核心对多进程(其实是轻量级进程)共享数据段的支持是不行的,因此,do_fork()提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、 CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信号句柄表)和CLONE_PID(共享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统调用时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境,而使用 pthread_create()来创建线程时,则最终设置了所有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的“进程”拥有共享的运行环境,只有栈是独立的,由__clone()传入。

     

    Linux线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创建、同步、删除等操作都在核外pthread库中进行。pthread 库使用一个管理线程(__pthread_manager(),每个进程独立且唯一)来管理线程的创建和终止,为线程分配线程ID,发送线程相关的信号(比如Cancel),而主线程(pthread_create())的调用者则通过管道将请求信息传给管理线程。

     

    主要函数说明

     

    1.线程的创建和退出

     

    pthread_create 线程创建函数

    int pthread_create (pthread_t * thread_id,__const pthread_attr_t * __attr,void *(*__start_routine) (void *),void *__restrict __arg);

     

    线程创建函数第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread 不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。当创建线程成功时,函数返回0,若不为0 则说明创建线程失败,常见的错误返回代码为EAGAIN 和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

     

    pthread_join 函数,来等待一个线程的结束。

    函数原型为:int pthread_join (pthread_t __th, void **__thread_return)

    第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。线程只能被一个线程等待终止,并且应处于joinable状态(非detached)。

     

    pthread_exit 函数

    一个线程的结束有两种途径,一种是线程运行的函数结束了,调用它的线程也就结束了;

    另一种方式是通过函数pthread_exit 来实现。它的函数原型为:void pthread_exit (void *__retval)唯一的参数是函数的返回代码,只要pthread_join 中的第二个参数thread_return 不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join 的线程则返回错误代码ESRCH。

     

    2.线程属性

     

  • 武汉销毁220余台赌博机 民警:实为“电子老千” 2019-07-20
  • 山西拨付2.7亿元资金支持全省七大河流生态修复治理 2019-07-14
  • 龙游龙天红木小镇 让红木“活”着呈现东方美 2019-07-14
  • 食疗-热门标签-华商生活 2019-07-12
  • 评论:着力提升中小学教师优秀传统文化素养 2019-07-11
  • 深夜食堂?半夜吃东西真的好吗 2019-07-11
  • 乌鲁木齐举办端午戏曲交响音乐会 两团一院名角新秀齐亮相 2019-06-28
  • 房价炒成这个样子,还不准说,像话么? 2019-06-28
  • 蔡鄂生:传统金融、互联网金融都要“接地气” 2019-06-16
  • 报道新闻记录历史 70载人民日报见证中国发展大事 2019-06-16
  • 新书《薛兆丰经济学讲义》在网红菜市场发布 萝卜白菜变身艺术品 2019-06-10
  • “表面整改”“虚假整改” 2019-06-10
  • 嗯,这个有可能。符合系统性关连。 2019-05-30
  • 六问手机流量那些事:我的流量去哪儿了? 2019-05-21
  • 网络餐饮新规明年起实施 鼓励外卖使用安全无害包装盒 2019-05-21
  • 奇迹觉醒手游能自由交易码吗 法兰克福书展的颁奖 东方6+1走势 东方国度救援彩金 比特币暴跌时黄金大涨 快速赛车计划软件下载 10元复式彩票怎么买 开设赌场罪严重吗 今天福建31选7开奖公告 311山东时时彩 新剑侠情缘3藏剑 皇室战争卡组推荐4阶 单机版新剑侠情缘游戏攻略 北京pk10开奖直播走势图 快乐扑克怎么玩赚钱 福建体彩网36选7走势图