Linux学习06——线程控制与同步互斥

本文详细介绍了Linux中线程的概念,包括线程的执行模型、多线程应用、共享变量、线程同步与互斥。重点讲解了线程的并发特性,Pthreads线程API,以及如何使用信号量和P/V操作解决资源调度问题。文章还探讨了线程同步的经典问题,如生产者/消费者和读者/写者问题,并讨论了如何使用多线程提高程序的并行性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

学习目标:

  • 理解线程概念和并发特征,分辨线程与进程的区别与联系
  • 掌握多线程应用编程技术,掌握线程间数据传递基本方法
  • 掌握共享变量识别方法,理解多线程访问共享变量可能带来的问题
  • 理解临界资源、临界区、线程互斥、线程同步基本概念
  • 理解保证临界区互斥执行的基本思想
  • 掌握用信号量和P/V操作来解决互斥、同步问题的编程方法
  • 掌握生产者/消费者、读者/写者问题两个经典同步问题的编程方法,并用以分析和解决实际应用
  • 了解AND型信号量、信号量集、条件变量和管程等同步机制
  • 理解线程安全、可重入型、线程竞争基本概念
  • 掌握利用多线程并发编程基本方法
  • 掌握并发程序性能分析基本方法

6.1 线程概念

6.1.1 什么是线程

传统应用程序特点与不足

启动一个传统C语言程序,产生一个进程,进程从main()函数开始,沿着程序流程往下执行,不严格地说,可认为每次仅执行一条语句(或一条指令),前一条语句(或指令)完成,后一条语句(或指令)才能开始。不足之处:

  • 一个进程只有一个代码执行序列(或控制流),只能接受一个CPU(或CPU核)为其服务,不便发挥多CPU或多核系统强大的计算能力
  • 进程每段时间只能执行一项活动,若有多项需要并发执行的活动,传统程序结构很难进行有效协调。比如程序在等待用户输入的同时,还要从消息队列接收消息,而此时用户输入尚未完成,消息还未到来。很难同时协调和管理多项并发活动,尤其是需要等待某种事件发生的活动。

什么是线程

采用多线程机制可以很好地解决前述问题。

  • 什么是线程:线程定义为进程内一个执行单元或一个可调度实体,每个执行单元可执行进程的一段程序代码(如函数)。在一个进程内可创建多个线程,这些线程都是并发逻辑流,每个线程可执行一项独立的活动或功能。 如Web服务器一个线程在给某浏览器产生网页时,另一线程就可侦听其他浏览器请求
  • 线程共享进程资源:属于同一进程的多个线程位于同一个地址空间内,共享进程拥有的资源,包括代码、数据(全局变量)、堆和打开文件等,线程需栈、程序计数器等少量资源,线程又称轻量级进程(LWP)

线程结构和状态

  •  线程结构:每个线程拥有一个线程控制块TCB(Thread Control Block)和一个线程栈,TCB用于存放线程相关属性,栈用于给函数调用、局部变量分配内存
  • TCB内容:与线程相关的属性放在线程控制块(TCB)内,TCB包括线程ID(Thread TID)、线程状态、栈指针、通用寄存器、程序计数器和标志寄存器
  • 线程比进程开销小:因线程工作所需的大部分资源和属性在进程中,线程需维护的资源、属性很少,线程创建、销毁所需开销很低(甚至低于进程开销的10%)
  • 线程基本状态及其转换

6.1.2 线程执行模型

  • 线程创建:进程启动时,先执行main函数,这个执行体为主线程(main thread);主线程在某个时刻可创建新的线程,称为对等线程(peer thread);此后各线程也可以根据需要创建更多对等线程
  • 线程间关系:线程之间无父子关系,都是对等的,一个进程相关的线程组成一个对等线程池(pool),独立于其他进程创建的线程
  • 好处:一个线程可以终止任何其他对等线程,或者等待任意其他对等线程终止
  • 线程间并发关系:各线程可因sleep、read等慢速系统调用,走走停停,交错往前推进

6.1.3 多线程应用

  • 让程序同时做多件事情。示例:在编辑文档的同时对文档中的单词个数进行实时统计。
  • 将一个耗时的进程任务划分成很多小任务,同时在多个CPU或核上执行。如大矩阵运算、海量数据检索
  • 管理多项并发活动。
  1. 示例1:对一个混杂输入、计算和输出的应用程序,输入、计算、输出各安排一个线程来做
  2. 示例2:通过多线程让进程同时等待多个事件,如网络连接、消息
  3. 示例3:网络服务器同时处理多个客户连接

6.1.4 第一个线程

  • pthread创建一个对等线程,对等线程的任务是peertask
  • 之后主线程与对等线程一起往下执行,由于每个线程执行输出一行文本后都usleep,让出CPU,控制两个线程来回切换
  • 对等线程peertask的return语句终止之后,主线程调用pthread_join函数等待对等线程终止,最后调用exit(0)终止整个程序

6.2 多线程并发特性与编程方法

6.2.1 Pthreads线程API

Pthreads提供了phtread_create、pthread_exit、pthread_join、pthread_detach、pthread_cancel等API函数,用于创建、退出、回收、分离和取消线程。

1. 创建线程

  • 创建线程

typedef void *(*Func) (void *arg);

int pthread_create(pthread_t *tid, pthread_attr_t *attr, Func fun,void *arg);

  • 获得线程TID: pthread_t pthread_self(void);

2. 终止线程

<think>好的,用户需要寻找TEWA-7500V光猫的超级密码或默认登录凭据。首先,我得回顾一下之前处理类似问题的经验,比如TEWA-700G、1000E等型号的解决方案。根据引用[1]、[3],天翼网关通常可以通过访问特定页面或使用工具获取sessionkey,进而解密得到超级密码。用户提到的TEWA-7500V可能也适用类似的方法。 接下来,我需要检查用户提供的引用内容是否有相关步骤。引用[1]提到项目地址,可能包含自动化脚本工具;引用[3]详细说明了通过sessionkey获取密码的过,包括访问特定URL和查找password字段。此外,引用[2]和[4]提到使用高级用户登录和删除TR069连接的方法,但可能对7500V不一定适用。 用户可能已经尝试过默认密码如telecomadmin和nE7jA%5m,但可能已被运营商修改。因此,建议用户通过获取sessionkey或使用工具来解密配置文件。需要提醒用户注意不同型号可能存在差异,操作前备份配置,并谨慎修改设置,以免影响网络。 最后,生成相关问题时,要覆盖默认密码、配置文件解密、桥接设置等常见需求,帮助用户全面了解可能遇到的问题和解决方法。</think>关于获取天翼网关TEWA-7500V的超级密码,根据同类设备的操作经验,可以尝试以下方法: ### 操作步骤 1. **获取SessionKey**(关键步骤) 通过访问光猫内置页面获取加密参数: ``` http://光猫IP/cgi-bin/getSessionKey.php ``` 返回结果如`<SesionKey>rX9kP</SesionKey>`,该参数用于后续解密[^3] 2. **下载配置文件** 访问带SessionKey的URL(需替换实际值): ``` http://光猫IP/cgi-bin/export_all_configurations.cgi?key=rX9kP ``` 将下载`allconfig.conf`加密文件 3. **解密配置文件** 使用开源工具`router_password_decrypt`进行解密: ```python python decrypt.py allconfig.conf ``` 成功后生成`allconfig.conf.xml`明文文件[^1] 4. **提取密码** 在解密文件中搜索`<Password>`标签: ```xml <X_ATP_UserInfoInstance InstanceID="1" UserName="telecomadmin" Password="telecomxxxxxxxx"/> ``` 其中`telecomxxxxxxxx`即为超级密码 ### 注意事项 - 默认账号固定为`telecomadmin` - 不同地区运营商可能采用不同的加密方式 - 操作前建议断开光纤避免配置重置 - 修改桥接模式需删除TR069连接(部分型号需特殊操作)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值