进程是没有活力的,它只是一个静态的概念。为了让进程完成一些工作,进程必须至少占有一个线程,所以线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码。实际上,单个进程可以包含几个线程, 它们可以同时执行进程的地址空间中的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和堆栈。

线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执行线程终止了,进程也就随之终止。

每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。

多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。这一点在多线程编程时应该注意。

现代操作系统大都提供了相应的机制,用来处理线程的生存期、同步,以及其他“和线程有关”的属性,如优先级、线程专有存储空间(thread-specific storage)等。多线程编程是一门语言的难点和重点。

接下来让我们看看处理线程的函数:pthread_create()函数,创建线程函数原型如下:int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void*), void *restrict arg);参数讲解:1、每个线程都有自己的ID即thread ID,可以简称tid,呵呵,是不是想起什么来了?……对,和pid有点象。其类型为pthread_t,pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:typedef unsigned long int pthread_t;可以看成是线程的标志符。当成功创建一个新线程的时候,系统会为该线程分配一个tid,并将该值通过指针返回给调用它的程序。

2、attr申明线程的属性。

属性结构为pthread_attr_t,它在头文件/usr/include/pthread.h中定义。设为NULL,表示在这里我们只使用线程的默认属性就可以了。

3、start_routine表示新创建的线程所要执行的例程。线程以调用该函数开始,直到由该函数返回(return)终止这个线程,或者在start_routine所指向的函数中调用pthread_exit函数终止。start_routine只有一个参数,该参数由随后的arg指针来指出。

4、arg:也是一个指针,也就是start_routine指针所指向的函数的参数。

返回值:当pthread_create调用成功时,该调用返回0;否则,返回一个错误代码指出错误的类型。

pthread_exit()函数线程的终止可以是调用了pthread_exit或者该线程的例程结束。也就是说,一个线程可以隐式的退出,也可以显式的调用pthread_exit函数来退出。

函数原型如下:void pthread_exit( void * value_ptr );线程的终止可以是调用了pthread_exit或者该线程的例程结束。也就是说,一个线程可以隐式的退出,也可以显式的调用pthread_exit函数来退出pthread_exit函数唯一的参数value_ptr是函数的返回代码,只要pthread_join中的第二个参数value_ptr不是NULL,这个值将被传递给value_ptr pthread_join()函数,等待一个线程终止调用pthread_join的线程将被挂起直到参数thread所代表的线程终止时为止。pthread_join是一个线程阻塞函数,调用它的函数将一直等到被等待的线程结束为止。

函数原型如下:int pthread_join(pthread_t th, void **thread_return);如果value_ptr不为NULL,那么线程thread的返回值存储在该指针指向的位置。该返回值可以是由pthread_exit给出的值,或者该线程被取消而返回PTHREAD_CANCELED.当一个非分离的线程终止后,该线程的内存资源(线程描述符和栈)并不会被释放,直到有线程对它使用了pthread_join时才被释放。因此,必须对每个创建为非分离的线程调用一次pthread_join调用,以避免内存泄漏。否则当线程是可分离的,调用pthread_exit,将终止该调用线程,并释放所有资源,没有线程等待它终止。

至多只能有一个线程等待给定的线程终止。如果已经有一个线程在等待thread线程终止了,那么再次调用pthread_join等待同一线程的线程将返回一个错误

linux下多线程的实现方法:1)使用全局变量  2)不使用全局变量   3)线程相关的数据实例1

#include #include #include

#define MAXLENGTH 20

void another_func(const char* threadName)

{ printf("%s is running in another_func\n",threadName);}

void * thread_func(void *args)

{ char threadName[MAXLENGTH];strncpy(threadName,(char*)args,MAXLENGTH-1);

printf("%s is running in thread_func\n",threadName);another_func(threadName);}

int main(int argc,char* argv[])

{ pthread_t pa,pb;pthread_create(&pa, NULL, thread_func, "Thread A");pthread_create(&pb, NULL, thread_func, "Thread B");

pthread_join(pa, NULL);pthread_join(pb, NULL);return 0;}输出结果为:Thread A is running in thread_func Thread A is running in another_func Thread B is running in thread_func Thread B is running in another_func

41/41234>

linux c++ queue 多线程,C++多线程,消息队列用法相关推荐

  1. Linux系统编程(七)消息队列

    Linux系统编程(七)消息队列 一.什么是消息队列 二.消息队列内部原理 三.实现消息队列的收发 1.发送消息队列 2.接收消息队列 四.消息队列与命名管道的比较 一.什么是消息队列 消息队列提供了 ...

  2. PHP消息队列用法实例分析

    这篇文章主要介绍了PHP消息队列用法,结合实例形式分析了PHP消息队列用于Linux下进程间通信的相关技巧,需要的朋友可以参考下 该消息队列用于linux下,进程通信 队列状态信息:具体参考手册 转载 ...

  3. linux 线程同步消息队列,Linux 多线程同步之消息队列

    消息队列是消息的链表,存放在内核中并有消息队列标示符标示. msgget用于创建一个新队列或打开一个现存的队列.msgsnd将新消息加入到消息队列中:每个消息包括一个long型的type:和消息缓存: ...

  4. tp5 queue.php,tp5(think-queue)消息队列+supervisor进程管理实现队列常驻进程

    前言 传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题.在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费 ...

  5. msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列

    Linux进程间的通信方式 ----消息队列. 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息. 消息队列存在于系统内核中,消息的数量受系统限制. 我们来看 ...

  6. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  7. Linux IPC实践(4) --System V消息队列(1)

    消息队列概述 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限于本机); 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值. 消息队列也有管道一样的不足:  ...

  8. linux网络编程之System V 消息队列(一):消息队列内核结构和msgget、msgctl 函数

    一.消息队列 1.消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 2.每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 3.消息队列与管道不同的是,消息队列是基于 ...

  9. 【Linux系统编程】进程间通信之消息队列

    00. 目录 文章目录 00. 目录 01. 消息队列概述 02. 消息队列相关函数 03. 消息队列读写操作 04. 测试代码 05. 附录 01. 消息队列概述 消息队列提供了一种在两个不相关的进 ...

  10. Linux IPC实践(6) --System V消息队列(3)

    消息队列综合案例 消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid cl ...

最新文章

  1. ASP中的常用服务器检测源码
  2. Oracle Advanced Security:Column Encryption Overhead
  3. DockerSwarm 微服务部署
  4. 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信
  5. jq ajax异步上传图片插件,jQuery异步上传文件插件ajaxFileUpload详细介绍
  6. python输出一个数的每一位_Python练习实例88 | 读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。...
  7. 三种常见嵌入式设备通信协议
  8. 初识ABP vNext(5):ABP扩展实体
  9. [代码阅读] ECS toString实现方法
  10. Bootstrap3基础 warning/active... 表格的状态类(不同的背景色)
  11. linux查找某个命令属于哪个rpm包
  12. 解决M1的mac打开JD-GUI报错问题(超简单)
  13. 图像文字识别易语言代码
  14. 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 完结篇 由金手指想到的...
  15. 天涯明月刀大地的服务器位置,天涯明月刀东海玉涡位置坐标指南[图]
  16. 正确的座机号码格式_电话号码的正确写法(我就知道你不知道)
  17. Hexo博客搭建教程
  18. 根据php经纬度百度地图打点,PHP使用百度地图获取指定地址坐标:经纬度(图文+视频)...
  19. 李飞飞在谷歌开发者大会宣布谷歌AI中国中心正式成立
  20. 绝对值海德汉编码器圆光栅RCN226/RCN228/RCN2380/RCN2310/RCN2381/RCN223FM/RCN2390FM/RCN2391FM参数

热门文章

  1. 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定
  2. 行云管家堡垒机 导入腾讯云主机
  3. 可持久化线段树学习笔记
  4. MySQL 数据库修改登录密码
  5. Loj #6307. 「雅礼国庆 2017 Day1」Clique
  6. jQuery 事件 - bind() 方法
  7. JavaScript快速入门(四)——JavaScript函数
  8. Makefile中=、:=、+=、?=的区别
  9. [转]如何在.NET MVC中使用jQuery并返回JSON数据
  10. ASP.NET教程11