记录一次上下文切换次数的统计

如果要记录因为获取不到锁而切换线程可以用这个封装的锁替代

#pragma once

#include <mutex>

#include <atomic>

#include <iostream>

#include "logger.h"

class StatisticMutex {

std::mutex mtx;

std::atomic<size_t> contention_count{0}; // 统计竞争次数

public:

void enter() {

// 尝试非阻塞获取,若失败则记录竞争

if (!mtx.try_lock()) {

logInfo("NYX ++1 \n");

contention_count.fetch_add(1, std::memory_order_relaxed);

mtx.lock(); // 阻塞等待

}

}

bool try_lock() {

bool success = mtx.try_lock();

if (!success) {

contention_count.fetch_add(1, std::memory_order_relaxed);

}

return success;

}

void leave() {

mtx.unlock();

}

size_t get_contention_count() const {

return contention_count.load(std::memory_order_relaxed);

}

};

用这个脚本统计线程下线程切换的次数每秒

while true; do cat /proc/9759/status | grep ctxt_switches; sleep 1; done

/proc# while true; do cat /proc/9759/status | grep ctxt_switches; sleep 1; done

voluntary_ctxt_switches: 6384

nonvoluntary_ctxt_switches: 408

voluntary_ctxt_switches: 6393

nonvoluntary_ctxt_switches: 409

voluntary_ctxt_switches: 6403

nonvoluntary_ctxt_switches: 410

主动切换次数大约9次每秒 大概有什么sleep 或者频繁的唤醒并且wait...

strace -e trace=nanosleep,futex,read,write -p 9759

strace: Process 9759 attached

通过strace发现确实有8次sleep 才想起是自己加的调试代码为了信标帧可以更频繁的发送 让手机可以识别

futex(0x2e08ca50, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, NULL, FUTEX_BITSET_MATCH_ANY) = 0

write(1, "2026-05-07 19:36:21.060491 [97"..., 85) = 85

futex(0x2e12f6b0, FUTEX_WAKE_PRIVATE, 1) = 1

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

write(61, "\252U\220\0\0\0\224\0\200\0\0\0\377\377\377\377\377\3778\257)3DU8\257)3DU \375"..., 151) = 151

nanosleep({tv_sec=0, tv_nsec=100000000}, 0x7ef8bfcfd0) = 0

futex(0x2e08ca50, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, NULL, FUTEX_BITSET_MATCH_ANY) = 0

改完之后就是标准的1s一次

while true; do cat /proc/21961/status | grep ctxt_switches; sleep 1; done

voluntary_ctxt_switches: 91

nonvoluntary_ctxt_switches: 3

voluntary_ctxt_switches: 92

nonvoluntary_ctxt_switches: 3

voluntary_ctxt_switches: 93

nonvoluntary_ctxt_switches: 3

相关推荐
KaMeidebaby8 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀8 小时前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
MDM.Plus9 小时前
苹果MDM技术演进:从远程控制到设备信任体系的构建
运维·服务器·安全·ios·mdm·手机店
happyprince9 小时前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法
大鱼>9 小时前
AI+货物追踪:智能快递柜追踪系统
人工智能·深度学习·算法·机器学习
写代码的学渣9 小时前
Linux systemd 开机启动日志逐行详细解析报告
linux·运维·服务器
researcher-Jiang10 小时前
算法训练:堆 & 可并堆
算法
郝学胜-神的一滴10 小时前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
在书中成长10 小时前
HarmonyOS 小游戏《对战五子棋》开发第18篇 - 棋盘设计
算法·harmonyos
Frostnova丶10 小时前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展