关于线程的基本常识

线程篇(主线程(UI线程),后台线程,线程池线程) 后续不间断增加、提示:以下是本篇文章正文内容,下面案例可供参考总之,不同的线程类型适用于不同的场景,我们需要根据具体的需求来选择合适的线程类型。在使用线程时,我们需要注意线程的生命周期、同步机制、异常处理、性能优化等方面的问题,以保证线程的稳定性和可靠性。 阅读详情

     线程

1)      定义。

n       线程由两个部分组成:

       1、线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。

       2、线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量。

n       当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。

n       线程总是在某个进程环境中创建。系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易地互相通信。

n       线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。

n       因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。

2)  运行机制。

n       操作系统为每一个运行线程安排一定的CPU时间 —— 时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时运行的一样。

n       如果计算机拥有多个CPU,线程就能真正意义上同时运行了。

注意的问题:进程是线程的容器,它的周期依赖于主线程的周期。所有的线程周期都依赖于主线程。CloseHandle().作用:关闭内核对象的一次引用,当引用次数为0时,系统将释放该内核对象占用的资源。

3)      互斥现象的产生:当访问公共资源时,还没有来得急作出改变资源内容时,该线程的时间片已经用完了,转到另一个线程时,又要对该作出资源访问、更改,当再一次轮到先前的线程时,公共资源已经被改变了,先前判断的状态已不再为真了,这样导致该线程代码执行混乱。

4)      线程间的同步的方法:

1.   互斥对象(mutex)

n         互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。
n         互斥对象包含一个使用数量,一个线程ID和一个计数器。
n         ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。
n         典型代码:

n         HANDLE hMutex;//定义全局变量。

n         hMutex=CreateMutex(NULL,TRUE,"tickets")//创建MUTEX

n         WaitForSingleObject(hMutex,INFINITE);//保护代码

           if(tickets>0)

           {

                 Sleep(1);

                 cout<<"thread1 sell ticket : "<<tickets--<<endl;

           }

           else

                 break;

           ReleaseMutex(hMutex);

5)      事件对象(event)

n         事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。
n         有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
n         典型代码:

HANDLE g_hEvent;//定义全局变量。

g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets")//创建Event

WaitForSingleObject(g_hEvent,INFINITE);//保护代码

           if(tickets>0)

           {

                  Sleep(1);

                  cout<<"thread1 sell ticket : "<<tickets--<<endl;

           }

           else

                  break;

           SetEvent(g_hEvent);

6)      关键代码段(CriticalSection)

n         关键代码段(临界区)工作在用户方式下。
n         关键代码段(临界区,对一种公共资源的访问区域)是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权。
n         哲学家进餐的问题本质:线程1拥有了临界区对象A,等待临界区对象B的拥有权,线程2拥有了临界区对象B,等待临界区对象A的拥有权,就造成了死锁。
n         典型代码:

while(TRUE)

       {

              EnterCriticalSection(&g_csA);

              if(tickets>0)

              {

                     Sleep(1);

                     cout<<"thread1 sell ticket : "<<tickets--<<endl;

              }

              else

                     break;

              LeaveCriticalSection(&g_csA);

       }

7)      三种方式的比较:

n         互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。
n         关键代码段是工作在用户方式下,同步速度较快,但在使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值
Linux 线程:使用&管理线程、多线程、分离线程 阅读详情

相关推荐

交通小白首投TRB就中Oral?我的完整时间线与避坑指南(附Editorial Manager实操截图)

本文详细解析了交通领域新手如何高效完成TRB国际会议投稿的全流程,从选题策略到投稿系统实操,再到评审过程解析和常见误区避坑指南。特别针对初次投稿者提供了实用建议,包括时间规划、选题考量、Editorial Manager系统操作技巧,以及如何应对评审意见。文章还分享了从录用到会议参与的关键步骤,帮助研究者提升投稿成功率。

weixin_27303545的博客 386

线程的实现

主要有三种方式: 1. 使用内核线程实现(1:1实现) 2. 使用用户线程实现(1:N实现)3. 使用用户线程加轻量级进程混合实现(N:M实现) 内核线程实现 内核线程就是直接由操作系统内核(下称内核)支持的线程由内核来完成线程切换 内核通过操纵调度器对线程进行调度 并负责将现成的任务映射到各个处理器上 程序一般不会直接使用内核线程 而是使用内核线程的一种高级接口——轻量级进程 (通俗意义上说的线程) 由于每个轻量级进程都是由一个内核线程支持 因此只有先支持内核线程 才能有轻量级进程 这种轻量级进程与

Azadoo的博客 339

Mathtype公式下标深度调整技巧:解决固定行距下的显示不全问题

本文针对在Word等文档中设置固定行距时,Mathtype公式下标显示不全的问题,提供了专业解决方案。核心在于调整Mathtype软件内部的“下标深度”参数,通过修改单个公式或批量格式化全文,使公式完美适配固定行距,确保下标清晰完整,且不影响文档整体排版。

pepsi的博客 1498

常见线程模型

连接独占线程或进程 在这个模型中,线程/进程处理来自绑定连接的消息,在连接断开前不退也不做其他事情。当连接数逐渐增多时,线程/进程占用的资源和上下文切换成本会越来越大,性能很差,这就是C10K问题的来源。这种方法常见于早期的web server,现在很少使用。 单线程reactor 以libevent, libev等event-loop库为典型。这个模型一般由一个event dispatcher等...

MLer 937

FreeRTOS项目:智能手表(1);

从 “最底层启动”→“系统基础配置”→“硬件驱动”→“中间件能力封装”→“上层业务功能”,分层递进、从基础到应用,就能逐步把整个项目的逻辑串联起来~

weixin_46847454的博客 1446

N线程共享的共享锁

今天实现一个可以实现自定义N个线程共享的共享锁,代码一部分来自《Java并发编程的艺术》。 如果想具体理解Java锁的底层原理,我非常建议大家购买这本书。 实现的功能是,提供一个初始化方法,可以接受一个int值来确定具体可以几个线程同时共享锁,锁实例化之后就不能修改该属性了。 方法的思路是来自《Java并发编程的艺术》这本书中关于锁的介绍,我只是稍加修改和完善。 实现上底层依赖了Java本...

buren的博客 612

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

多线程基本常识

多线程的状态可以总结为以下几种:新建(New):线程被创建但还没有启动。就绪(Runnable):线程被调度,并且准备开始执行,但还没有开始执行。运行(Running):线程正在执行中。阻塞(Blocked):线程因为某种原因被阻塞,例如等待 IO 操作完成或在等待锁释放。等待(Waiting):线程被指定等待某个条件满足,例如调用了对象的 wait() 方法。

Flying_Fish_roe的博客 1209

峰值电流模式CCM BUCK的传递函数推导

电流内环闭环传递函数: Gci(s)=i^L(s)v^comp(s)=FmGid(s)1+KRiHe(s)FmGid(s)=1Ri11+s[mcL+(0.5VIN−Vo)RiVINRifSW]+s21(πfSW)2 G_{ci}(s)=\frac{\hat i_{L}(s)}{\hat v_{comp}(s)}=\frac {F_mG_{id}(s)}{1+KR_iH_e(s)F_mG_{id}(s)}=\frac{1}{R_i}\frac{1}{1+s[\frac{m_cL+(0.5V_{IN}-V_o)

c007106333的博客 2354

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

软件测试面试一周冲刺:从背题到条件反射的高效备考法

软件测试面试考察的不只是知识储备,更是在高压场景下能否结构化输出测试用例、排查接口异常、定位日志问题。从测试理论到数据库SQL、Linux命令、接口自动化,面试官真正关注的是候选人是否具备系统化的质量保障思维。理解这些基础原理后,通过高密度输出训练,把项目经验、用例设计、故障排查链路转化为条件反射,才能在有限时间内展现专业度。无论你是转行新手还是经验型测试工程师,掌握通用面试框架、实战演练高频场景,并围绕典型业务模块构建可复用的答题逻辑,就能高效打通软件测试面试核心关卡。

weixin_34246551的博客 777

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

thread_create(线程基本常识)

package com.gzhs.zsd.thread; /*** * 了解线程创建方式 * 线程Thread实现Runnable接口 * @author 谢泽鹏 * @version 1.0 */ public class Traditional_Thread { public static void main(String[

suenpeng 5855

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java线程进门_java线程的基本常识

线程的常识现在多线程应用越来越多了,守护线程,web服务器(如tomcat对servlet的使用),用户界面(如实现进度条)等等。而且,主流的编程语言也基本都支持多线程了,java,c++,c#,c等等,所以在编程的时候可以地轻松实现它。但是,在实际应用当中却很少去考虑线程到底是个什么东西,在大脑里面也就是个模糊的印象。这篇文章权当对线程的一个基本了解。要想把线程说清楚了,先要把进程的概念弄明白。...

weixin_42510841的博客 86

Java多线程系列1(线程基本常识)

1 线程的生命周期线程声明周期,经典图示意如下: 线程的几个状态解释如下: 1)当调用 new Thread()时候,线程处于新建状态。此时JVM为线程分配内存空间,执行必要的初始化; 2)调用start(),此时线程会进入到线程等待队列,等待CPU的调度。此时线程处于Runnable状态; 3)线程抢占到CPU的执行权,此时CPU开始执行线程。

tencent_hw的博客 511

Android新建子线程的一些问题(如何获知已经结束子线程,子线程基本常识等)

比如如下代码当中包含了两个子线程,通过这次应该了解到的关于子线程的一些问题是: 1.子线程可以操作主线程当中拥有的数据,在不发生冲突的情况下主线程子线程之间的数据不需要传递 2.使用handler机制获取到子线程是否结束,并判断是否进行接下来的操作 3.不要把子线程单纯的当做一个简单的函数,除非是觉得很有必要才开一个子线程,毕竟线程之间是相互独立的,没那么容易就可以知道其什么时候结束,并且执行

WillWinwin 5426

【pthread系列-5】Pthreads线程的基本常识

1.Pthreads中线程的接口函数 与线程相关的头文件为pthread.h,编译时要连接的库为pthread。 pthread_t thread; 线程的数据类型为pthread_t。 int pthread_equal(pthread t1,pthread t2); 判断两个线程标识符是不是代表的是同一个线程。线程标识符只有相等和不等的关系,没有大小关系。 int pthread_

相信并热爱着 859

作为JAVA开发工程师,这些基本常识你都知道吗

这篇文章主要讲述一些JAVA基本常识,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 目录计算机语言的发展史Java语言的发展史Java语言关键术语Java三大类JavaSE【标准版本】JavaEE【企业版本】JavaME【微型版本】Java语言主要特点1、跨平台/可移植2. 面向对象3. 安全性4. 多线程5. 简单易用Java语言四大特性1、多态2、继承3、抽象4、封装Java的加载与执行 个人感觉:身为Java工程师,这些是有必要掌握的,其次的话就是有一部分面试

怪咖@的博客 3977

UNIX上C++程序设计守则(信号和线程)

UNIX上C++程序设计守则(信号和线程) 摘自桃源谷的blog: http://www.cppblog.com/lymons Unix跟Windows等那些”对于开发者易于使用”的OS比起来,在信号和线程的利用方面有诸多的限制。但是即使不知道这些知识就做构架设计和实现的情况也随处可见。这个就是那些经常不能再现的bug的温床吧。 因此,我想分成几回来写一些准则来防止陷入到这些圈套里。 准则

wintree的专栏 3348

工程师基本常识

工程师基本常识 异步IO (异步输入输出) 异步传输存在一个潜在的问题,即接收方并不知道数据会在什么时候到达。在它检测到数据并做出响应之前,第一个比特已经过去了。这就像有人出乎意料地从后面走上来跟你说话,而你没来得及反应过来,漏掉了最前面的几个词。因此,每次异步传输的信息都以一个起始位开头,它通知接收方数据已经到达了,这就给了接收方响应、接收和缓存数据比特的时间;在传输结束...

weixin_30273175的博客 135

Linux菜鸟起飞之路【二】Linux基本常识

一、Unix操作系统基本常识 1.什么是Unix? Unix是一个计算机操作系统,是一个用来协调、管理和控制计算机硬件与软件资源的控制程序。 2.Unix操作系统的特点? 多用户与多任务。多用户表示在同一时刻可以有多个用户使用Unix操作系统且互不干扰;多任务表示任何一个用户在同一时间可以在Unix上执行多个任务。 3.Unix诞生前后简要历史 1946年:世界上第一台...

Mr_wh_2014的博客 345

ANR 基本常识分析

当APP不响应、响应慢了、或者WatchDog的监视没有得到回应时,系统就会dump出一个`traces.txt`文件,存放在文件目录:`/data/anr/traces.txt`,通过traces文件,我们可以拿到线程名、堆栈信息、线程当前状态、binder call等信息。当你的项目越做越复杂,或者你的用户达到某个数量级的时候,你的代码不小心出现细小的问题,你会收到各种各样的bug,其中ANR的问题你一定不会陌生。`com.xxxx.moblie` 占用了11%的CPU,其实这并不算多。

kingmasterlife的博客 2125
下一篇: javascript 常用代码大全
anchoretor
博客等级 码龄21年 30粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值