c++

1 容器 1.1 基本概念 c++ stl 对象 指针 引用 迭代器 容器接口 1.1 接口 // 1.1 vector —— 动态数组 vector<int> v = {1, 2, 3}; v.push_back(4); // 末尾添加 v.pop_back(); // 删除末尾 v.size(); // 元素个数 v.empty(); // 是否为空 v[0]; // 随机访问(无边界检查) v.at(0); // 随机访问(边界检查) v.front(); v.back(); // 首/尾元素 v.clear(); // 清空 // 1.2 deque —— 双端队列 deque<int> d = {1, 2}; d.push_front(0); // 头插 d.push_back(3); // 尾插 d.pop_front(); // 头删 d.pop_back(); // 尾删 d.front(); d.back(); // 首/尾访问 d.size(); d.empty(); // 1.3 list —— 双向链表 list<int> l = {1, 2, 3}; l.push_front(0); l.push_back(4); l.pop_front(); l.pop_back(); l.remove(2); // 删除所有值为2的元素 l.size(); l.empty(); l.front(); l.back(); // 1.4 set —— 有序唯一集合 set<int> s = {3, 1, 4, 1}; // 实际存储 {1,3,4} s.insert(2); // 插入 s.erase(3); // 删除指定值 s.find(4); // 查找,返回迭代器,未找到返回 end() s.count(1); // 计数(0或1) s.size(); s.empty(); // 允许重复元素用 multiset,接口基本相同 // 1.5 map —— 有序键值对 map<string, int> ages; ages["Alice"] = 25; // 插入/修改;注意:若 key 不存在,[] 会自动插入一个默认值(0) ages["Bob"] = 30; ages.erase("Alice"); // 删除 ages.find("Bob"); // 查找,不想触发自动插入就用 find 而不是 [] ages.count("Tom"); // 计数 ages.size(); ages.empty(); // 允许重复key用 multimap,接口基本相同 // 1.6 unordered_set —— 哈希无序集合 unordered_set<int> us = {3, 1, 4, 1}; us.insert(2); us.erase(4); us.find(3); // O(1) 查找 us.count(1); us.size(); us.empty(); // 1.7 unordered_map —— 哈希无序键值对 unordered_map<string, int> scores; scores["Tom"] = 95; scores["Jerry"] = 88; scores.erase("Tom"); scores.find("Jerry"); scores.count("Bob"); scores.size(); scores.empty(); // 1.8 stack —— 栈(LIFO) stack<int> st; st.push(1); // 入栈 st.push(2); st.top(); // 查看栈顶 st.pop(); // 出栈(无返回值) st.empty(); st.size(); // 1.9 priority_queue —— 优先队列(默认最大堆) priority_queue<int> pq; pq.push(5); pq.push(1); pq.push(10); pq.top(); // 最大元素(10) pq.pop(); // 移除堆顶 pq.empty(); pq.size(); // 想要最小堆:priority_queue<int, vector<int>, greater<int>> minPq; // 1.10 pair —— 两个值的组合,不用专门定义 struct pair<string, int> p1 = {"Alice", 25}; p1.first; // "Alice" p1.second; // 25 pair<int, int> p2 = make_pair(1, 2); // 另一种构造写法 // 1.11 string —— 字符串(可以当成 char 的容器,替代 char* + strcpy/strcat 那一套) string s2 = "hello"; s2 += " world"; // 拼接 s2.size(); s2.length(); // 长度(两个等价) s2.empty(); s2[0]; // 下标访问 s2.substr(1, 3); // 从下标1开始取3个字符,"ell" s2.find("wor"); // 查找子串,返回起始下标,找不到返回 string::npos s2.replace(0, 5, "Hi"); // 替换 s2.append("!"); // 追加 to_string(42); // int -> string stoi("123"); // string -> int s2.c_str(); // 要传给 C 函数(如 fopen)时转成 const char* // 1.12 array —— 固定大小数组(比原生C数组多了 .size() 等接口,但不能动态扩容) array<int, 3> a = {1, 2, 3}; a.size(); a[0]; a.fill(0); // 全部填充为0 1.2 其他 对所有容器通用 ...

August 13, 2026 · 4 min · 782 words · Me

国测 claude

VSCode Claude Code 扩展配置 本文记录如何在 VSCode 中配置 Claude Code 扩展,接入第三方(海量/glm)模型服务,无需在本机维护环境变量,扩展启动时自动注入。 配置位置 VSCode 用户级配置文件: Windows:%APPDATA%\Code\User\settings.json (即 C:\Users\<用户名>\AppData\Roaming\Code\User\settings.json) macOS:~/Library/Application Support/Code/User/settings.json Linux:~/.config/Code/User/settings.json 打开方式:VSCode 中按 Ctrl + , 打开设置 → 右上角「打开设置 (JSON)」图标,或直接 Ctrl + Shift + P 输入 Preferences: Open User Settings (JSON)。 完整配置 将以下内容合并进 settings.json(注意 JSON 语法,最后一项末尾不要多逗号): { "claudeCode.environmentVariables": [ { "name": "ANTHROPIC_BASE_URL", "value": "http://172.16.105.104:3000" }, { "name": "ANTHROPIC_AUTH_TOKEN", "value": "sk-hR1tQQloyPW0ax9b7404D51285Ae4737A118457535Fc33Ae" }, { "name": "ANTHROPIC_MODEL", "value": "glm-5.2" }, { "name": "ANTHROPIC_DEFAULT_OPUS_MODEL", "value": "glm-5.2" }, { "name": "ANTHROPIC_DEFAULT_SONNET_MODEL", "value": "glm-5.2" }, { "name": "ANTHROPIC_DEFAULT_HAIKU_MODEL", "value": "glm-5" }, { "name": "CLAUDE_CODE_SUBAGENT_MODEL", "value": "glm-5" }, { "name": "CLAUDE_CODE_EFFORT_LEVEL", "value": "max" } ], "claudeCode.preferredLocation": "panel" } 环境变量说明 变量名 作用 说明 ANTHROPIC_BASE_URL API 基础地址 指向第三方中转服务(兼容 Anthropic 协议)。海量外网网关示例:http://172.16.105.104:3000 ANTHROPIC_AUTH_TOKEN 鉴权令牌 中转服务下发的 sk-xxx,等价于官方的 API Key ANTHROPIC_MODEL 默认模型 主对话使用的模型 ANTHROPIC_DEFAULT_OPUS_MODEL Opus 档模型 覆盖官方 Opus 映射,通常设为最强模型 ANTHROPIC_DEFAULT_SONNET_MODEL Sonnet 档模型 覆盖官方 Sonnet 映射,日常主力 ANTHROPIC_DEFAULT_HAIKU_MODEL Haiku 档模型 覆盖官方 Haiku 映射,轻量快模型,用于补全/摘要 CLAUDE_CODE_SUBAGENT_MODEL 子 Agent 模型 Task/Explore 等子任务使用的模型,建议用快模型省钱 CLAUDE_CODE_EFFORT_LEVEL 推理强度 max 表示最高推理强度(思考最深),可选 low/medium/high/max 扩展项 claudeCode.preferredLocation:控制 Claude Code 面板的默认停靠位置,可选 panel(底部面板)或 editor(作为编辑器标签页)。 ...

July 27, 2026 · 2 min · 336 words · Me

ai

# 角色 你是一名 PostgreSQL 16 内核开发工程师,精通 src/backend/access/transam 及相关模块源码。 # 约束 1. 所有回答必须严格基于 PostgreSQL 16 Release 源码。 2. 解释机制时,必须引用具体的 .c/.h 文件路径和关键函数名。 3. 涉及数据结构时,请给出 struct 定义所在的头文件及字段含义。 4. 禁止使用“可能”、“通常”等模糊词汇描述内核行为;若不确定或版本不符,请明确告知。 5. 代码片段必须标注来源文件及大致行号范围(或函数上下文)。 # 当前任务 - 请梳理 XactBegin() 到 XactCommit() 的核心调用链,重点说明 CriticalSection 的作用。 - 解释 PG16 中 clog (pg_xact) 的写入与刷盘时机,结合 TransactionIdSetPageStatus 函数分析。 - MVCC 快照获取逻辑在 GetSnapshotData 中是如何与活跃事务列表交互的? - 两阶段提交 (2PC) 在 PG16 中的状态持久化流程是什么?涉及哪些 WAL record 类型? # 输出格式 1. 核心流程图/调用链(文字描述即可) 2. 关键源码位置(文件:函数) 3. 设计意图与权衡(Why it is implemented this way) 4. 相关 GUC 参数及其对代码路径的影响

July 3, 2026 · 1 min · 78 words · Me

工具 硬件资源

1 磁盘 # 各文件夹大小 du -sh ./* | sort -hr

May 29, 2026 · 1 min · 10 words · Me

claude

安装 wget https://unofficial-builds.nodejs.org/download/release/v20.18.1/node-v20.18.1-linux-x64-glibc-217.tar.xz tar -Jxvf node-v20.18.1-linux-x64-glibc-217.tar.xz mv node-v20.18.1-linux-x64-glibc-217 node-20 touch envn echo ' export NODEHOME=`pwd`/node-20 export PATH=$NODEHOME/bin:$PATH export LD_LIBRARY_PATH=$NODEHOME/lib:$LD_LIBRARY_PATH ' > envn source envn mkdir npm-global npm config set prefix `pwd`/npm-global npm config set prefix $NODEHOME/npm-global echo 'export PATH=$NODEHOME/../npm-global/bin:$PATH' >> envn source envn npm pack @anthropic-ai/claude-code npm install -g ./anthropic-ai-claude-code-2.1.162.tgz claude --version https://www.tapd.cn/43100420/markdown_wikis/show/#1143100420001007544 export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic export ANTHROPIC_AUTH_TOKEN="sk-e435fe4629934fc892c226fc26d7ac92" export ANTHROPIC_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-flash export CLAUDE_CODE_EFFORT_LEVEL=max # 内网 export ANTHROPIC_BASE_URL=http://172.16.99.137:8081 export ANTHROPIC_AUTH_TOKEN=sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy export ANTHROPIC_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-flash export CLAUDE_CODE_EFFORT_LEVEL=max # 内网 glm export ANTHROPIC_BASE_URL=http://172.16.99.137:8081 export ANTHROPIC_AUTH_TOKEN=sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy export ANTHROPIC_MODEL=glm-5.2 export ANTHROPIC_DEFAULT_OPUS_MODEL=glm-5.2 export ANTHROPIC_DEFAULT_SONNET_MODEL=glm-5.2 export ANTHROPIC_DEFAULT_HAIKU_MODEL=glm-5 export CLAUDE_CODE_SUBAGENT_MODEL=glm-5 export CLAUDE_CODE_EFFORT_LEVEL=max # 外网: http://172.16.105.104:3000 $env:ANTHROPIC_BASE_URL = "https://api.deepseek.com/anthropic" $env:ANTHROPIC_AUTH_TOKEN = "sk-e435fe4629934fc892c226fc26d7ac92" $env:ANTHROPIC_MODEL = "deepseek-v4-flash" $env:ANTHROPIC_DEFAULT_OPUS_MODEL = "deepseek-v4-flash" $env:ANTHROPIC_DEFAULT_SONNET_MODEL = "deepseek-v4-flash" $env:ANTHROPIC_DEFAULT_HAIKU_MODEL = "deepseek-v4-flash" $env:CLAUDE_CODE_SUBAGENT_MODEL = "deepseek-v4-flash" $env:CLAUDE_CODE_EFFORT_LEVEL = "max" # 外网 海量 $env:ANTHROPIC_BASE_URL = "http://172.16.105.104:3000" $env:ANTHROPIC_AUTH_TOKEN = "sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy" $env:ANTHROPIC_MODEL = "glm-5.2" $env:ANTHROPIC_DEFAULT_OPUS_MODEL = "glm-5.2" $env:ANTHROPIC_DEFAULT_SONNET_MODEL = "glm-5.2" $env:ANTHROPIC_DEFAULT_HAIKU_MODEL = "glm-5" $env:CLAUDE_CODE_SUBAGENT_MODEL = "glm-5" $env:CLAUDE_CODE_EFFORT_LEVEL = "max" export ANTHROPIC_BASE_URL=http://172.16.105.104:3000 export ANTHROPIC_AUTH_TOKEN=sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy export ANTHROPIC_MODEL=glm-5.2 export ANTHROPIC_DEFAULT_OPUS_MODEL=glm-5.2 export ANTHROPIC_DEFAULT_SONNET_MODEL=glm-5.2 export ANTHROPIC_DEFAULT_HAIKU_MODEL=glm-5 export CLAUDE_CODE_SUBAGENT_MODEL=glm-5 export CLAUDE_CODE_EFFORT_LEVEL=max # 外网 海量 $env:ANTHROPIC_BASE_URL = "http://172.16.105.104:3000" $env:ANTHROPIC_AUTH_TOKEN = "sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy" $env:ANTHROPIC_MODEL = "deepseek-v4-flash" $env:ANTHROPIC_DEFAULT_OPUS_MODEL = "deepseek-v4-flash" $env:ANTHROPIC_DEFAULT_SONNET_MODEL = "deepseek-v4-flash" $env:ANTHROPIC_DEFAULT_HAIKU_MODEL = "deepseek-v4-flash" $env:CLAUDE_CODE_SUBAGENT_MODEL = "deepseek-v4-flash" $env:CLAUDE_CODE_EFFORT_LEVEL = "max" export ANTHROPIC_BASE_URL=http://172.16.105.104:3000 export ANTHROPIC_AUTH_TOKEN=sk-q49Joop5Yz2BuS1ZPBPWJuCvwnS5elwKy9nP7PaLSi6fWrdy export ANTHROPIC_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro[1m] export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-flash export CLAUDE_CODE_EFFORT_LEVEL=max [System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "https://api.deepseek.com/anthropic", "User") [System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "sk-e435fe4629934fc892c226fc26d7ac92", "User") [System.Environment]::SetEnvironmentVariable("ANTHROPIC_MODEL", "deepseek-v4-pro[1m]", "User") [System.Environment]::SetEnvironmentVariable("ANTHROPIC_DEFAULT_OPUS_MODEL", "deepseek-v4-pro[1m]", "User") [System.Environment]::SetEnvironmentVariable("ANTHROPIC_DEFAULT_SONNET_MODEL", "deepseek-v4-pro[1m]", "User") [System.Environment]::SetEnvironmentVariable("ANTHROPIC_DEFAULT_HAIKU_MODEL", "deepseek-v4-flash", "User") [System.Environment]::SetEnvironmentVariable("CLAUDE_CODE_SUBAGENT_MODEL", "deepseek-v4-flash", "User") [System.Environment]::SetEnvironmentVariable("CLAUDE_CODE_EFFORT_LEVEL", "max", "User") # 安装nodejs yum install -y nodejs mkdir ~/.npm-global npm config set prefix '~/.npm-global' echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc source ~/.bashrc # 安装claude npm install -g @anthropic-ai/claude-code # 验证 claude --version cd /data/postgresql17 # 5. 启动 Claude Code 并进行首次认证 # 运行后,终端会提供一个链接,在浏览器中完成账号授权即可 claude # 6. (可选但推荐) 生成项目记忆文件 # 在 Claude 交互界面中,输入以下命令,它会分析项目并生成 CLAUDE.md 文件 /init # linux 使用代理 curl -L https://github.com/MetaCubeX/mihomo/releases/latest/download/mihomo-linux-amd64-compatible.gz | gunzip > /usr/local/bin/mihomo chmod +x /usr/local/bin/mihomo mkdir -p /etc/clash curl -o /etc/clash/config.yaml http://43.135.139.219:9999/clash.yaml # 3. 启动 Clash nohup mihomo -f /etc/clash/config.yaml > /var/log/clash.log 2>&1 & # 4. 设置代理环境变量(Clash 默认 mixed-port 7890) export http_proxy=http://127.0.0.1:7890 export https_proxy=http://127.0.0.1:7890 # 5. 测试 curl -I https://www.google.com git config --global user.name "shenkun" git config --global user.email "shenkun@bupt.cn" ssh-keygen -t rsa -C "shenkun@bupt.cn" cat ~/.ssh/id_rsa yum install proxychains-ng -y echo "socks5 10.255.255.254 1080" >> /etc/proxychains.conf # windows11 安装clash https://github.com/clash-verge-rev/clash-verge-rev/releases yum install -y shadowsocks-libev cat > /etc/shadowsocks-libev/client.json << 'EOF' { "server": "43.135.139.219", "server_port": 443, "local_address": "127.0.0.1", "local_port": 1080, "password": "gauss@123", "method": "aes-256-gcm" } EOF ss-local -c /etc/shadowsocks-libev/client.json -f /var/run/ss-local.pid export https_proxy=socks5://127.0.0.1:1080 # githup 使用 # 启动 claude claude --resume # 恢复最近一次对话 claude --continue # 继续上一次对话 claude --model <name> # 指定模型 claude --dangerously-skip-permissions # 跳过所有权限确认 claude update # 命令 /clear # 清楚所有对话 /compact # 压缩上下文,保留摘要 /rewind # 回滚上一次对话 /memory # 编辑记忆文件,记住偏好 /resume # 恢复历史会话 /context # 显示上下文窗口使用量 # 项目 /init 初始化项目,生成CLAUDE.md /review # 代码审查 /commit # 提交 # 环境 /config # 调整主题、模型等 /model [name] # 切换模型 /permissions # 工具权限白名单 /doctor # 检查环境 /mcp /cost # token用量和费用 /usage # 扩展 /skill /自定义skill # 快捷键 | 快捷键 | 功能 | | :--- | :--- | | `Shift + Tab` | 循环切换三种模式:计划模式 → 默认模式 → 自动编辑模式 | | `!command` | 直接在终端执行 bash 命令(不发给 AI) | | `Ctrl + B` | 将阻塞的进程放到后台,继续对话 | | `Esc Esc` | 双击 Esc 等同于 `/rewind` 回滚 | | `Ctrl + V` | 粘贴图片到对话框 | | `Option/Ctrl + Enter` | 输入框换行(Enter 是直接发送) | 模型名称 厂商 发布时间 核心亮点(精简) 定位/优势场景 GPT-5.6 (Sol/Terra/Luna) OpenAI 2026.07.09 7月9日刚全球开放;三档分层+速度拨盘;Codex与ChatGPT合一 全能旗舰、超级智能体 GPT-5.5 OpenAI 2026.04.24 首个从零重训基础模型;100万tokens;MoE+Verifier架构 真实工作流、编程调试 DeepSeek-V4 (Pro/Flash) 深度求索 2026.04.24 万亿参数MoE开源;百万token原生上下文;成本仅OpenAI 1/100 开源性价比之王、Agent Qwen3.7-Max 阿里巴巴 2026.05.20 国产Arena盲测第一;全域思考模式;Agentic Coding全球前三 国产旗舰、智能体编程 Claude Opus 4.7/4.8 Anthropic 2026 Q2 代码质量最优;长文本推理首选;WebDev Arena排名第一 编程审校、深度推理 Gemini 3.5 Pro Google 2026.06 Artificial Analysis智能指数登顶;集成计算机使用(CU)能力 复杂推理、多模态科研 Grok 4 / 4.5 xAI 2026.05-07 实时接入X平台;编码与Agent能力持续强化;百亿~千亿参数 实时信息、社交分析 Kimi-K2.6 月之暗面 2026 H1 长文本办公统治级;JSON输出稳定;指令遵循能力强 办公自动化、Agent GLM-5.1 智谱AI 2026 Q2 国产第一梯队;编程能力进入Top7;综合能力稳居前列 通用对话、编程辅助 豆包 2.1 Pro 字节跳动 2026.06 中文口语最自然;移动端交互最佳;多模态细节强 C端用户、内容创作 Meta Muse Spark 1.1 Meta 2026.07 首次开放Model API;正面争夺企业开发者市场 企业开发、开源生态 Llama 4 Meta 2026(预计) 开源生态标杆;多模态原生;社区微调最丰富 开源基座、定制微调

March 6, 2026 · 3 min · 635 words · Me

工具 python

查看python安装路径 python -c "import sys, os; print(os.path.dirname(sys.executable))" python下载pgk python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名

December 29, 2025 · 1 min · 15 words · Me

工具 gdb

查看某个进程占用的内存 ps -p 17286 --no-headers -o pid,comm,rss,%mem | awk '{printf "%-8s %-20s %8.2f MB %5s%%\n", $1, $2, $3/1024, $4}' gdb调试进程或coredump文件时,变量取值出现’optimized out’时,关闭编译优化 # 以编译PG为例: configure --enable-debug --disable-optimizations CFLAGS="-g -O0 -fno-inline -fno-omit-frame-pointer" gdb启动调试阶段,自动执行命令 touch ~/.gdbinit echo "handle SIGUSR2 nostop noprint" >> ~/.gdbinit 判断编译选项 readelf --debug-dump=info `which bin_name` | grep -E 'DW_AT_producer.*O[0-9]'

October 15, 2025 · 1 min · 49 words · Me

工具 git

git log --author=shenkun --oneline x86 git status -uno | awk '{if (NR>1) print $3}' | grep src | xargs -I {} git add {} arm git status -uno | grep modified | awk '{if (NR>1) print $2}' | xargs -I {} git add {} git tag -l git ls-remote --tags origin git fetch --tags

September 24, 2025 · 1 min · 54 words · Me

工具 tcpdump

tcpdump -i any -w ./vsql.pcap 'tcp port 5432'

September 4, 2025 · 1 min · 8 words · Me

工具 多线程 thread

1 多线程框架 gcc thd.c -lpthread -o thd #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <pthread.h> #include <unistd.h> #include <semaphore.h> bool prtlog = true; #define ASSERT(cond) \ if (!(cond)) {printf("ASSERT | file: %s line: %d func: %s\n", __FILE__, __LINE__, __FUNCTION__); exit(-1);} #define LOG(thdctl, fmt, ...) \ do { \ if (prtlog) { \ char data_[2048]; \ snprintf(data_, 2048, (fmt), ##__VA_ARGS__); \ thdctl != NULL ? \ printf(" >%-3d %s\n", ((ThdCtl *)(thdctl))->id, data_) : \ printf("%s\n", data_); \ } \ } while (0) /* ---------------------------------------------------------------------- */ typedef struct ThdCtl ThdCtl; typedef struct ThdData ThdData; typedef void (*ThdHookFunc)(ThdCtl *thdctl, ThdData *data); struct ThdCtl { /* thread info */ int stat; pthread_t thd; int id; /* thread function */ ThdHookFunc init_func; ThdHookFunc exec_func; ThdHookFunc exit_func; ThdData *data; /* thread control */ bool iswait; sem_t wait; }; typedef struct { int thdnum; ThdCtl *thdarr[10000]; } ProCtl; /* ---------------------------------------------------------------------- */ void multi_execute(ThdHookFunc initfunc, ThdHookFunc execfunc, ThdHookFunc exitfunc, int thdnum, ThdData *dataarr); typedef struct ThdData { int id; } ThdData; void init(ThdCtl *thdctl, ThdData *data) { LOG(thdctl, "init"); data->id = thdctl->id; } void execute(ThdCtl *thdctl, ThdData *data) { LOG(thdctl, "execute, id: %d", data->id); } void finish(ThdCtl *thdctl, ThdData *data) { LOG(thdctl, "finish, id: %d", data->id); } int main() { ThdData datas[10] = {0}; multi_execute(init, execute, finish, 10, datas); return 0; } /* ---------------------------------------------------------------------- */ void *thread_main(void *arg) { ThdCtl *tctl = (ThdCtl *)arg; if (tctl->init_func != NULL) { tctl->init_func(tctl, tctl->data); } /* wait to be wake up */ // LOG(tctl, "sleep"); sem_wait(&tctl->wait); /* wake up now */ // LOG(tctl, "wakeup"); tctl->iswait = false; /* ====== user funtion begin ========== */ if (tctl->exec_func != NULL) { tctl->exec_func(tctl, tctl->data); } /* ====== user funtion finish ========== */ if (tctl->exit_func != NULL) { tctl->exit_func(tctl, tctl->data); } return NULL; } ThdCtl *create_thread(ProCtl *process, ThdHookFunc initfunc, ThdHookFunc execfunc, ThdHookFunc exitfunc, void *thddata) { static int thdid = 0; ThdCtl *t = (ThdCtl *)malloc(sizeof(ThdCtl)); if (t == NULL) { ASSERT(false); return NULL; } /* thread info */ t->stat = -1; t->id = thdid++; /* thread function */ t->init_func = initfunc; t->exec_func = execfunc; t->exit_func = exitfunc; t->data = thddata; t->stat = pthread_create(&t->thd, NULL, thread_main, t); /* thread control */ t->iswait = true; sem_init(&t->wait, 0, 0); process->thdarr[process->thdnum] = t; process->thdnum++; return t; } ProCtl *create_process() { ProCtl *pro = (ProCtl *)malloc(sizeof(ProCtl)); ASSERT(pro != NULL); pro->thdnum = 0; memset(pro->thdarr, 0, sizeof(pro->thdarr)); return pro; } void multi_execute(ThdHookFunc initfunc, ThdHookFunc execfunc, ThdHookFunc exitfunc, int thdnum, ThdData *dataarr) { ProCtl *pro = create_process(); LOG(NULL, "init ------------------------"); int i; for (i = 0; i < thdnum; i++) { create_thread(pro, initfunc, execfunc, exitfunc, &dataarr[i]); } LOG(NULL, "execute ------------------------"); for (i = 0; i < pro->thdnum; i++) { ThdCtl *tctl = pro->thdarr[i]; sem_post(&tctl->wait); } for (i = 0; i < pro->thdnum; i++) { pthread_join(pro->thdarr[i]->thd, NULL); } LOG(NULL, "finish ------------------------"); } 2 多线程示例

May 22, 2025 · 3 min · 463 words · Me
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀