线程使用

嵌入式中线程应用还是看需求,一般不常用(在不会使用的情况下)

一、编译有线程的应用程序需要编译时指定编译lib库 ( -l pthread) 如:gcc main.c -o main -l pthread 才能编译通过。

二、线程使用。
1、线程运行时有分离模式和非分离模式。
简单一点说分离模式就是,把线程和自己所在的进程中分离出去,由系统去分出时间片去执行线程,此时主进程会继续向下执行。
而非分离模式是等待线程执行完毕后,进程会继续向下执行。
而在创建线程后系统默认的都是非分离模式的,so 需要设置分离模式时需要特定的设置才可以。
2、设置分离模式
方法一、通过设置线程分离模式的属性使线程分离执行(实时性好)


  1. void process_printf()
  2. {
  3.     sleep(1);
  4.     printf("sleep in thread\n");
  5. }

  6. int main()
  7. {
  8.     pthread_t thread_id;
  9.     int ret;
  10.     pthread_attr_t attr;
  11.     pthread_attr_init(&attr);
  12.     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  13.     ret = pthread_create(&thread_id, &attr, process_printf, NULL) ;
  14.     pthread_attr_destroy(&attr);

  15.     return 1;
  16. }


方法二、设置分离属性,使线程同步(实时性好)

  1. void process_printf()
  2. {
  3.     //pthread_detach(pthread_self()); //method 1: 可以在线程中设置分离模式
  4.     sleep(1);
  5.     printf("sleep in thread \n");
  6. }

  7. int down_or_up_to_cloud()
  8. {
  9.     pthread_t thread_id;
  10.        int ret;
  11.  
  12.     ret = pthread_create(&thread_id, NULL, process_printf, NULL) ;
  13.     pthread_detach(thread_id); //method 2: 线程创建完毕设置分离模式 
  14.     
  15.     return 1;
  16. }
好处:设置分离模式后,线程在运行完毕后,系统会回收线程中的资源,这样不会有内存泄漏的问题啦,可以放心使用。

问题:线程创建后,进程使用内存一下会增大8M以上,原因是系统创建线程后,会分配出8M 大小的线程运行缓存,但是有时候在设置分离模式后,而且确定线程已经运行完毕了,这8M内存还是没有释放,这大概是系统并未回收这个线程空间,预备下次创建线程,直接使用此线程的空间,也许就是系统的一个优化功能,此处不过多揣摩,了解一下就好。
线程的8M空间在整个进程结束后会完全释放,再次启动进程后,运行到创建线程时,此进程才会增加8M的运行空间。
3、非分离模式
当我们使用系统默认的线程处理模式时,一不小心就会导致内存泄漏的问题。
例如:

例1、非分离模式创建后,没注意回收资源,导致内存泄漏

  1. int main()
  2. {
  3.     pthread_t thread_id;
  4.     int ret;

  5.     ret = pthread_create(&thread_id, NULL, process_one, NULL) ;

  6.     ret = pthread_create(&thread_id, NULL, process_two, NULL) ;
  7.      ....
  8.     ret = pthread_create(&thread_id, NULL, process_N, NULL) ;

  9.     return 1;
  10. }
上例在主进程中创建多个线程,或者在整个应用程序中需要不定时的去创建进程去处理事情,可以确定的是每创建一个线程系统会自动开辟8M的线程缓存,这样不停的积累,内存会耗尽,导致内存泄漏。
如果一定要用非分离模式那么就需要加入回收资源的的函数。pthread_join(tid, &status);

例1、非分离模式创建后,没注意回收资源,导致内存泄漏

  1. int main()
  2. {
  3.     pthread_t thread_id_1,thread_id_2,thread_id_3...thread_id_n;
  4.     int ret;

  5.     ret = pthread_create(&thread_id_1, NULL, process_one, NULL) ;

  6.     ret = pthread_create(&thread_id_2, NULL, process_two, NULL) ;
  7.      ....
  8.     ret = pthread_create(&thread_id_n, NULL, process_N, NULL) ;
  9.      pthread_join(thread_id_1, NULL);
  10.       pthread_join(thread_id_2, NULL);
  11.       ...
  12.       pthread_join(thread_id_n, NULL);
  13.     return 1;
  14. }
添加thread_join 函数是等待线程运行完毕后,然后回收资源的作用。so 线程好用,但要慎用,别出问题都不知道在哪儿出错了。


好了,就先简单说一下吧,欢迎指出问题,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ MFC string转Cstring为什么会乱码

前段时间学习mfc编了一个小程序,其中涉及到CString 与string的转换的时候感觉特别蛋疼,因此再此总结一下经验。希望能够对大家能有所帮助 通常有两种字符集模式 unicode字符集 和 ascii字符集,其中unicode有多种编码方式。utf8, …

metaq原理简介

1. 前言 本文档旨在描述RocketMQ的多个关键特性的实现原理,并对消息中间件遇到的各种问题进行总结,阐述RocketMQ如何解决这些问题。文中主要引用了JMS规范与CORBA Notification规范,规范为我们设计系统指明了方向,但是仍有不少问题…

3d展示网页开发_超实用:一篇文章带你了解市面上主流通用的3D模型格式

说到格式,相信大家都不陌生。随着互联网的普及,我们几乎每天都会和不同的格式打交道,文本的TXT、图片的JPG、视频的MP4,就连压缩包也有不同的格式。通俗来说,你可以把“格式”理解成基于同一规范的技术表征&#xff0c…

java三件套_Java开发人员应该知道的三件事

java三件套对于那些长期关注JavaOne 2012会议的读者来说,这是一篇有趣的文章。 我最近对Java冠军Heinz Kabutz的采访引起了我的注意; 包括他的Java内存难题程序,从Java内存管理的角度来看,这很有启发性。 采访中有一个特别的部分吸…

Python 的变量作用域和 LEGB 原则

在 Python 程序中创建、改变或查找变量名时,都是在一个保存变量名的地方进行中,那个地方我们称之为命名空间。作用域这个术语也称之为命名空间。 具体地说,在代码中变量名被赋值(Python 中变量声明即赋值,global 声明的…

让MessageBox在最前面弹出来的信息在

nt MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box ); 在uType参数中设置MB_SYSTEMMODAL就能让MessageBox在最前面 消息框…

Confluence 6 管理协同编辑 - 关于 Synchrony

协同编辑能够让项目小组中的协同合作达到下一个高度。这个页面对相关协同编辑中的问题进行了讨论,能够提供给你所有希望了解的内容。 进入 Collaborative editing 页面来获得项目小组是如何进行实时的协同工作的,这些协同工作包括在软件需求,…

如何初始化局部变量c语言_【C语言更新】C语言中如何来定义一个指针,并且对其进行初始化...

文/Edward上一节中,我们利用了一个小知识来介绍了一下指针,在上面这个例子中,小明和小丽手中的这个杯子就好比我们C语言中的变量,它确实是实实在在存放一些有具体意义的数据。这个杯套就类似于C语言中指针的作用,假设我…

Spring Environment仅用于初始化代码

从3.1版开始, Spring框架提供了对几种不同来源的抽象,通过它们您可以轻松地配置应用程序: Environment 。 在这篇文章中,我描述了一个微基准测试,我可以证明该基准测试是一个方便的API(如果您在应用程序中…

linux查看和关闭后台执行程序

后台执行的程序会有一个pid,查看后台程序主要用到jobs,ps 关闭后台程序用到kill详细说明转自http://blog.csdn.net/tianlesoftware/article/details/6165753 一. 有关进程的几种常用方法 1.1 & 符号 在命令后面加上一个 & 符号,表示该命令放在后台执行&…

Mysql 多表联合查询效率分析及优化

1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用, 如: SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 由于其返回的结果为被连接的两…

Python的__getattr__方法学习

内容部分来自网络 __getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数; 如果没有定义这个函数,那么抛出Attribu…

python to_excel新增sheet_Python使用xlrd和xlwt读写Excel的简单用法

前言数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用Python 进行数据相关的工作时,难免要和 Excel 打交道。标准的 Excel 文件(xls/xlsx)具有较复杂的格式,并不方便像普通文本文件一样直…

linux 线程管理、同步机制等

线程学了那么多有关进程的东西,一个作业从一个进程开始,如果你需要执行其他的东西你可以添加一些进程,进程之间可以通信、同步、异步。似乎所有的事情都可以做了。 对的,进程是当初面向执行任务而开发出来的,每个进程代…

SQL多表连接查询(详细实例)

本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,…

cf 1059e 思维 贪心 树

参考博客:http://www.cnblogs.com/waldenlake/p/9750249.html 题意:将一棵n个点的带权有根树剖分成尽量少的链,使得 (1)链的两个端点是祖先关系 (2)链含有的顶点个数小于等于L (3&am…

powermock模拟对象_使用PowerMock模拟构造函数

powermock模拟对象在我看来,依赖注入的主要好处之一是可以将模拟和/或存根对象注入代码中,以提高可测试性,增加测试覆盖率并编写更好,更有意义的测试。 但是,有时候您会遇到一些不使用依赖注入的传统代码,而…

宝塔 没有找到站点_宝塔面板正确开启TLS 1.3并删除TLS 1.1

昨天折腾了一个AlphaSSL泛域名证书后,心血来潮去SSL评分网站测试了一番,最后的结果竟然是B,这真是不能忍啊……为啥会是B,查看了原因,竟然是启用了TLS 1.1,所以为B。那么,删除TLS 1.1不就可以了…

线程同步机制:互斥量、信号量、读写锁、条件变量

一、互斥量(mutex) 互斥量本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。 对互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放…

在Cloudfoundry上部署RESTful服务

在本文中,我们将使用Pivotal Cloud Foundry(PCF)Dev在Cloudfoundry上部署RESTful服务。 由于创建静态Web服务不是本文的一部分,因此我已经创建了employee-service ,它具有静态后端,可从GitHub进行克隆。 在…