qq_52484093
码龄4年
关注
提问 私信
  • 博客:142,642
    社区:33
    142,675
    总访问量
  • 269
    原创
  • 100,209
    排名
  • 216
    粉丝
  • 0
    铁粉
  • 学习成就
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:浙江省
  • 加入CSDN时间: 2020-11-12
博客简介:

qq_52484093的博客

查看详细资料
  • 原力等级
    成就
    当前等级
    5
    当前总分
    1,319
    当月
    3
个人成就
  • 获得267次点赞
  • 内容获得16次评论
  • 获得540次收藏
  • 代码片获得370次分享
创作历程
  • 18篇
    2024年
  • 59篇
    2023年
  • 100篇
    2022年
  • 92篇
    2021年
成就勋章
TA的专栏
  • Linux系统编程
    32篇
  • 网络编程
    22篇
  • C++
    50篇
  • 设计模式
    1篇
  • 音视频
    25篇
  • 操作系统
    86篇
  • 算法
    12篇
  • makefile
    13篇
  • Git
  • Qt
    27篇
兴趣领域 设置
  • 嵌入式
    单片机
  • 硬件开发
    arm开发
创作活动更多

HarmonyOS开发者社区有奖征文来啦!

用文字记录下您与HarmonyOS的故事。参与活动,还有机会赢奖,快来加入我们吧!

0人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

多线程局部存储技术

在两个线程中打印 g_global 的地址和值。但在后续的子线程在函数调用的时候,我们需要将指向 ThreadGlobal 类型的指针作为函数的参数传入来区分每个线程专属的全局变量,这边我们使用了宏定义,优化了这个问题。第 67 行,在创建子线程的时候,我们会 malloc 一个 ThreadGlobal 这个结构体,将这个指针传入每个子线程,这样每个子线程都有唯一的变量。第 10 行,我们通过 __thread 关键字来修饰变量 g_global,使得 g_global 变量在每个线程都有一份拷贝。
原创
发布博客 2024.05.05 ·
294 阅读 ·
5 点赞 ·
0 评论 ·
10 收藏

多线程与信号量简介

第 53 行,get_shared_memory() 函数调用了 shmget() 函数,shmget() 是一个Linux系统调用函数,用于创建一个新的共享内存段(segment)或获取一个已存在的共享内存段。子线程读完以后,信号量 w 的值会加一,主线程才能去写;由于信号量的初始值为 1,所以只能有一个子线程获取到信号量,其它的线程来获取信号量时,发现信号量的值为 0,就会阻塞等待信号量被释放。该程序中使用的两个信号量,信号量 w 和信号量 r,信号量 w 的初始值为 1,信号量 r 的初始值为 0。
原创
发布博客 2024.05.04 ·
720 阅读 ·
14 点赞 ·
0 评论 ·
22 收藏

线程同步与条件变量

第 54 行,如果生产者生产了产品后发现上一次的产品没了,则调用 pthread_cond_signal(&g_cond),来唤醒阻塞在 g_cond 这个条件变量上的单个消费者线程来取产品,这样原先阻塞在 g_cond 这个条件变量上的某个线程就会被唤醒,重新抢夺互斥锁,取走产品,然后释放互斥锁。第 24 行,如果消费者发现没有产品,则调用 pthread_cond_wait(&g_cond, &g_mutex) 阻塞在 g_cond 这个条件变量上,并释放已获取到的互斥锁 g_mutex。
原创
发布博客 2024.05.02 ·
871 阅读 ·
11 点赞 ·
0 评论 ·
16 收藏

多线程读写锁应用

无论是 "读锁" 还是 "写锁",解锁都是调用 pthread_rwlock_unlock()如果两个线程 "同时" 拿到了 "读锁" 和 "写锁",问:哪个线程先进入临界区执行?读写锁在实现上比互斥量复杂,单纯的 "上锁" 和 "解锁" 操作读写锁相对互斥量低效。因此,针对多线程 "读" & "写" 场景需要更具针对性的解决方案。问题:互斥量可用于多线程 "读" & "写" 共享变量的场景吗?保护临界区时,必须清楚当前需要使用 "读锁" 还是 "写锁"读优先:拿到 "读锁" 的线程优先进入临界区。
原创
发布博客 2024.02.23 ·
490 阅读 ·
3 点赞 ·
1 评论 ·
10 收藏

活锁方案与自旋锁

当超时未能获取目标锁,则让出处理器使用权,线程进入阻塞状态。自旋锁与互斥量类似,在任何时刻,最多只能有一个持有者。轻量级锁定,即:临界区相对短小,自旋锁持有时间非常短。即:线程 获取锁 到 释放锁 的时间内只有一个执行流。自适应锁相对普通互斥量效率更高,相对自旋锁安全性更好。线程一旦获取自旋锁,则不能让出处理器使用权。如果只有一个单核处理器,不建议使用自旋锁。自适应锁先以自旋的方式持续尝试获取目标锁。线程获取互斥量失败后究竟发生了什么?如何设置获取互斥量时的等待时间?一种特殊的互斥量,又名:自适应锁。
原创
发布博客 2024.02.05 ·
473 阅读 ·
5 点赞 ·
0 评论 ·
6 收藏

多线程互斥量进阶

假设有 三个线程 (A,B,C) 和三个互斥量 (R,S,T),三个线程对互斥量的获取及释放如下,问:是否可能发生死锁?一个线程多次尝试获取同一个互斥量,会发生什么?破坏死锁条件中的任意一个!
原创
发布博客 2024.02.02 ·
385 阅读 ·
3 点赞 ·
0 评论 ·
4 收藏

排队模型应用案例

定义任务结构体 (CurTask) 模拟顾客 (CurTask 变量表示具体客户)方案:将多个线程预先存储在一个 "池子" 内,当需要线程时直接从 "池子" 取出。使用队列数据结构表示等待队列,队列中存储 CurTask 变量 (顾客排队模拟)各个线程从队列中取任务时是互斥操作 (每次只能一个线程操作队列)如何模拟等待中的顾客 (即:如何模拟待执行的任务)?利用线程池模拟工作窗口,每个线程表示一个工作人员。如何模拟工作窗口 (即:如何模拟工作人员)?线程从队列中取出任务执行 (服务客户模拟)
原创
发布博客 2024.02.01 ·
308 阅读 ·
6 点赞 ·
0 评论 ·
1 收藏

初识多线程互斥量

这种操作一旦开始,就一直执行到结束,中途不会被打断原子操作可以是一个步骤,也可以是多个步骤的集合原子操作的顺序不可以被打乱,也不可以被切割而只执行其中的一部分原子操作在多 任务/线程 并发时能够保证操作结果的正确性。
原创
发布博客 2024.02.01 ·
285 阅读 ·
5 点赞 ·
0 评论 ·
1 收藏

线程的连接与分离

pthread_join() 等待的线程必然是 pthread_create() 创建的线程。父进程调用 wait() / waitpid(),为子进程 "收尸" 处理并释放暂留资源。pthread_join() 除了等待线程执行结束,还会释放线程所占用的资源。线程进入分离状态,其它线程无法连接 (不可等待 且 无法获取返回值)线程的分离状态指线程不可能执行连接操作 (并非脱离进程不可控)可连接的线程退出后需要执行连接操作,否则线程资源无法释放。分离状态的线程退出后主动释放系统资源 (常规需求)
原创
发布博客 2024.02.01 ·
445 阅读 ·
5 点赞 ·
0 评论 ·
5 收藏

Linux线程API详解(下)

pthread_cleanup_push() 和 pthread_cleanup_pop() 之间构成内部作用域。pthread_exit() 与 pthread_cancel() 总是会触发清理函数执行。pthread_cleanup_pop() 的参数非零时,触发一个清理函数执行。main() 中执行 return 语句,意味着主线程执行结束,因此进程结束。vfork() 进程只是一个新的执行流 (无任何附带资源的执行流)vfork() 不能和父进程同时执行 (父进程等待子进程结束)
原创
发布博客 2024.01.31 ·
727 阅读 ·
17 点赞 ·
0 评论 ·
6 收藏

Linux线程API讲解(上)

线程执行流调用 pthread_exit() 函数 (注意:void exit(int status);其它线程对指定线程调用 pthread_cancel() 函数 (不安全)线程入口函数执行了 return 语句,并返回指定值。该函数用于等待指定的线程 (tid) 执行结束。如果指定线程已经执行结束,则函数调用立即返回。如果指定线程必须不可连接,则函数调用失败。参数 retval 用于接收线程 返回值。
原创
发布博客 2024.01.29 ·
444 阅读 ·
6 点赞 ·
0 评论 ·
4 收藏

深入浅出线程原理

Linux 内核中的基本调度单位为 task_struct,即:内核中以 "任务" 作为调度的基本单位。对于线程来说,pthread_t 类型的标识符 与 pid_t 类型标识有什么不同?每一个线程在内核中都对应一个调度实体,拥有独立的结构体 (task_struct)pid_t pid => 线程标识符 (Thread ID)因此,kill 任意子线程的 pid_t 将导致整个进程结束。进程创建后默认拥有一个线程,即:主线程 (默认执行流)拥有多线程的进程,又被称为线程组 (谁是线程组长?
原创
发布博客 2024.01.12 ·
935 阅读 ·
23 点赞 ·
0 评论 ·
22 收藏

Linux线程编程初步

线程创建函数:int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void*), void* arg);创建 / 销毁 线程花费的时间 < 创建 / 销毁 进程花费的时间。进程:应用程序的一次加载执行 (系统进行资源分配的基本单位)多进程程序共享一段内存 => "机制复杂"进程中的多个线程并行执行,共享进程资源!多线程代码复杂度 > 多进程代码复杂度。线程:进程中的程序执行流。
原创
发布博客 2024.01.11 ·
433 阅读 ·
8 点赞 ·
0 评论 ·
8 收藏

浅谈进程优先级(下)

换算关系:规范优先级 = MAX_RT_PRIO - 实时优先级 - 1。PRI = 规范优先级 - 40 = 59 - rt_priority。对于实时进程而言,内核模式的优先级与用户模式的优先级并不同。PRI = 规范优先级 - 40 + nice_value。将父进程设置为实时进程,且实时优先级为 99 (调度器)对于实时进程,设置 nice_value 会发生什么?父进程进入循环调度,根据时间片定义改变子进程的调度策略。在优先级不同的时候,先执行优先级高的进程。如何定制实时进程的执行时间?
原创
发布博客 2024.01.08 ·
608 阅读 ·
8 点赞 ·
0 评论 ·
10 收藏

浅析进程优先级(上)

进程优先级:将处理器资源分配给进程的先后顺序Linux 中每个进程都有相应的优先级 (优先级可能动态改变)进程优先级决定进程 何时执行 和 获得处理器的时间进程优先级通常表现为一个整数值 (数值大小决定优先级高低)
原创
发布博客 2024.01.08 ·
985 阅读 ·
19 点赞 ·
0 评论 ·
16 收藏

多核调度实验设计

吞吐量存在理论上限值,进程数量多余处理器数量时,吞吐量只能逼近理论上限值。执行进程数量 处理器数量:延迟增加,吞吐量不变。如何验证处理器,进程数量,吞吐量之间的关系?执行进程数量 = 处理器数量:吞吐量达到顶峰。
原创
发布博客 2024.01.04 ·
388 阅读 ·
6 点赞 ·
0 评论 ·
9 收藏

多核调度预备知识

ps -- 查看进程运行时数据 (ps au)top -- Linux 整体性能监测工具 (类似任务管理器)sar -- Linux 活动情况报告 (系统性能分析工具)
原创
发布博客 2024.01.03 ·
936 阅读 ·
18 点赞 ·
0 评论 ·
20 收藏

初探Linux进程调度

Linux 系统中可以使用 chrt 命令来查看、设置一个进程的优先级和调度策略命令用法主要参数-p, --pid 操作一个已存在的 PID,不启动一个新的任务-f, -fifo 设置调度策略为 SCHED_FIFO-m, --max 显示最小和最大有效优先级,然后退出-o, --other 设置调度策略为 SCHED_OTHER-r, --rr 设置调度策略为 SCHED_RR。
原创
发布博客 2024.01.02 ·
362 阅读 ·
6 点赞 ·
0 评论 ·
9 收藏

信号处理设计模式

线程创建函数:int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void*), void* arg);先屏蔽所有信号 (无法递达进程),之后为屏蔽信号创建文件描述符;当时机成熟,通过 read() 系统调用读取未决信号 (主动接收信号)由于给每个信号唯一的标记位置,因此,所有信号转变为不可靠信号;其他线程:首先屏蔽所有可能的信号,之后执行任务代码。每个线程拥有独立的信号屏蔽掩码。
原创
发布博客 2023.12.26 ·
1558 阅读 ·
24 点赞 ·
1 评论 ·
24 收藏

信号优先级与安全性

方案:对目标进程发送 N 次 "无" 序信号,验证信号递达进程的先后次序。不要在信号处理函数中调用不可重入函数 (即:使用了全局变量的函数)对于同一个进程,如果存在两个不同的未决实时信号,那么先处理谁?当信号递达,转而执行信号处理函数时,不可重入的函数不能调用。信号的本质是一种软中断 (中断有优先级,信号也有优先级)不要调用函数中存在临界区的函数 (可能产生竞争导致死锁)不要调用标准 I/O 函数,如:printf() 函数。对于不同的未决实时信号,信号值越小优先级越高。目标:验证信号的优先级。
原创
发布博客 2023.12.25 ·
875 阅读 ·
19 点赞 ·
0 评论 ·
21 收藏
加载更多