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/8/13 23:29:31 阅读更多 →
Fable 5项目:将《红色警戒2》从x86桌面移植到iOS ARM平台的技术实践

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

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

2026/8/14 4:31:57 阅读更多 →
C# DriveInfo类详解:获取驱动器信息与磁盘监控实战

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

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

2026/8/13 21:07:09 阅读更多 →

最新新闻

AI图片清晰化技术解析:从原理到工具实战指南

AI图片清晰化技术解析:从原理到工具实战指南

1. 项目概述:从模糊到清晰的视觉革命 你有没有遇到过这样的场景?翻看老照片,发现父母年轻时的合影已经泛黄模糊,人脸都看不清了;或者在网上好不容易找到一张绝佳的素材图,放大后却全是马赛克,根…

2026/8/15 3:39:37 阅读更多 →
BMP280气压传感器原理与应用:从MEMS技术到Arduino/ESP32实战

BMP280气压传感器原理与应用:从MEMS技术到Arduino/ESP32实战

1. 项目概述:从一块“小芯片”到环境感知的桥梁如果你玩过Arduino或者树莓派,大概率对GY-BMP280-3.3这个模块不陌生。它看起来就是一块蓝色或绿色的PCB板,上面顶着一个比米粒大不了多少的黑色芯片,外加几个电容电阻,朴…

2026/8/15 3:39:37 阅读更多 →
折半查找算法详解:从原理到变体与工程实践

折半查找算法详解:从原理到变体与工程实践

1. 从“大海捞针”到“对半砍”:为什么折半查找是程序员的基本功 如果你写过代码,处理过数据,那你一定遇到过“查找”这个问题。比如,在一个存了100万个用户ID的数组里,快速找到某个特定的ID是否存在。最笨的办法是什么…

2026/8/15 3:39:37 阅读更多 →
AI时代个人效率革命:构建结构杠杆系统,从工具使用者到系统架构师

AI时代个人效率革命:构建结构杠杆系统,从工具使用者到系统架构师

1. 项目概述:重新定义AI时代的个人效率最近和不少同行、朋友聊天,发现一个挺普遍的现象:大家都很焦虑,也很努力。桌上摆着好几本AI工具书,收藏夹里塞满了各种“AI提效”教程,每天花大量时间尝试新的AI应用&…

2026/8/15 3:39:37 阅读更多 →
BMP280气压传感器模块全解析:从原理到实战应用

BMP280气压传感器模块全解析:从原理到实战应用

1. 项目概述:从一块蓝色小板到环境感知核心如果你玩过Arduino或者树莓派,大概率在淘宝、拼多多上见过那种蓝色的小板子,上面印着“GY-BMP280-3.3”或者“BMP280模块”。它通常只有指甲盖大小,几个引脚,看起来平平无奇。…

2026/8/15 3:39:37 阅读更多 →
Git Extensions图形化工具:10分钟掌握高效Git工作流

Git Extensions图形化工具:10分钟掌握高效Git工作流

1. 项目概述:为什么你需要一个图形化的Git工具?如果你已经接触过Git,大概率对命令行(CLI)又爱又恨。爱的是它强大、精准,恨的是那一长串需要记忆的命令和参数,尤其是在处理分支合并、解决冲突或…

2026/8/15 3:38:37 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →