TLPI 第30 章 练习:Threads: Thread Synchronization
笔记和练习博客总目录见开始读TLPI。30-1修改清单 30-1thread_incr.c中的程序使得线程的 start 函数中的每个循环都输出 glob 的当前值以及某个唯一标识线程的标识符。线程的唯一标识符可以作为参数传递给创建线程的 pthread_create() 调用。对于这个程序这意味着需要将线程 start 函数的参数改为指向包含唯一标识符和循环上限值的结构体的指针。运行程序将输出重定向到文件然后检查文件看看当内核调度程序在两个线程之间交替执行时glob 会发生什么变化。清单 30-1为threads/thread_incr.c。代码如下#includepthread.h#includetlpi_hdr.hstaticvolatileintglob0;/* volatile prevents compiler optimizations of arithmetic operations on glob */typedefstruct{inttid;intloops;}Thread_args;staticvoid*/* Loop arg-loops times incrementing glob */threadFunc(void*arg){Thread_args*targ(Thread_args*)arg;intloc,j;for(j0;jtarg-loops;j){locglob;loc;globloc;printf(t%d:%d\n,targ-tid,glob);}returnNULL;}intmain(intargc,char*argv[]){pthread_tt1,t2;Thread_args targ1,targ2;ints;targ1.loopstarg2.loops(argc1)?getInt(argv[1],GN_GT_0,num-loops):10000000;targ1.tid1;targ2.tid2;spthread_create(t1,NULL,threadFunc,targ1);if(s!0)errExitEN(s,pthread_create);spthread_create(t2,NULL,threadFunc,targ2);if(s!0)errExitEN(s,pthread_create);spthread_join(t1,NULL);if(s!0)errExitEN(s,pthread_join);spthread_join(t2,NULL);if(s!0)errExitEN(s,pthread_join);printf(glob %d\n,glob);exit(EXIT_SUCCESS);}运行如下输出到日志文件out$ ./ex30-11000000out $tail-fout t1:1998633 t1:1998634 t1:1998635 t1:1998636 t1:1998637 t1:1998638 t1:1998639 t1:1998640 t1:1998641 glob1998641由于没到2000000说明日志文件out中肯定有重复的值即t1:xxxx和t2:xxxx。找出重复值$seds/^...//out|sort|uniq-Dout.repeat $wc-lout.repeat2720out.repeat查看重复值说明当数字很大时才会出现问题$moreout.repeat10001801000180100577110057711006209100620910077181007718...对应日志文件out中的位置1000916行t2:1000180...## 一直是t2的输出1000935行t2:10001991000936行t1:1000180......1006508行t1:10057711006509行t2:10057711006510行t2:1005773## 日志文件中无t2:1005772......1006947行t1:10062091006948行t2:10062091006949行t2:1006211## 日志文件中无t2:100621030-2实现一组线程安全的函数用于更新和搜索非平衡二叉树。这个库应该包括以下形式的函数用途显而易见:initialize(tree);add(tree,char*key,void*value);delete(tree,char*key)Booleanlookup(char*key,void**value)在上面的原型中树是一个指向树根的结构你需要为此目的定义一个合适的结构。树的每个元素都保存一个键值对。你还需要为每个元素定义一个结构包括一个互斥锁用来保护该元素以确保同一时间只有一个线程可以访问它。initialize()、add() 和 lookup() 函数实现起来比较简单。delete() 操作则需要花费更多的精力。不需要维护平衡树大大简化了实现的锁定需求但也有风险某些输入模式可能会导致树的性能很差。维护平衡树则需要在 add() 和 delete() 操作中在子树之间移动节点这就需要更复杂的锁定策略。此题暂无时间先略过了。

相关新闻

SpringBoot+Vue企业级智慧图书管理系统架构解析

SpringBoot+Vue企业级智慧图书管理系统架构解析

1. 项目概述:企业级智慧图书管理系统的技术架构解析 这套基于SpringBootVueMyBatisMySQL的企业级智慧图书管理系统源码,是当前图书管理领域的技术集大成者。我在实际部署测试中发现,它完美融合了前后端分离架构的优势,后端采用Spr…

2026/10/24 17:07:51 阅读更多 →
Fable 5项目:将《红色警戒2》从x86桌面移植到iOS ARM平台的技术实践

Fable 5项目:将《红色警戒2》从x86桌面移植到iOS ARM平台的技术实践

最近在技术社区看到不少关于游戏移植的讨论,尤其是经典老游戏如何在现代移动设备上焕发新生。这让我想起一个非常有意思的项目:Fable 5。它并非一个商业游戏引擎,而是一个由开发者社区驱动的、旨在将经典PC游戏《命令与征服:红色警…

2026/10/30 17:08:51 阅读更多 →
C# DriveInfo类详解:获取驱动器信息与磁盘监控实战

C# DriveInfo类详解:获取驱动器信息与磁盘监控实战

1. 项目概述:为什么需要获取驱动器信息? 在C#开发中,尤其是涉及到文件管理、系统监控、安装程序或者资源管理类应用时,获取本地或网络驱动器的详细信息是一个基础且高频的需求。你可能需要检查U盘是否插入、监控某个分区的剩余空间…

2026/10/30 18:18:54 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/30 0:01:36 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/30 9:20:34 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/30 10:19:21 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/30 0:01:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/30 10:19:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/30 9:21:37 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 17:32:24 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 10:28:40 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 0:01:33 阅读更多 →