程序员的自我修养 -- 链接、装载与库

《程序员的自我修养--链接,装载与库》 阅读详情

首先声明,这是一本好书。:)


-- 但是存在一些问题,也有可能是我理解的不够。。 ?


2012.11.22

1.6.2 线程安全

互斥量(Mutex)描述说,哪个线程获取了互斥量,哪个线程就要负责释放,其他线程越俎代庖去释放互斥量是无效的。

---------------------------------

这里说法是错误的,最起码针对Linux实现的pthread_mutex是错误的。

一个简单的测试程序即可验证上述错误:

#include <pthread.h>

#include <stdio.h>

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void *thread(void *arg)
{
        int i = 1;

        while (1) {
                printf("Now i'll try to unlock ... %d\n", i++);
                pthread_mutex_unlock(&lock);
                sleep(3);
        }
}

int main()
{
        int i = 1;
        pthread_t td;
        pthread_create(&td, NULL, thread, NULL);


        while (1)
        {
                printf("Before mutex_lock... %d\n", i);
                pthread_mutex_lock(&lock);
                printf("After mutex_lock... %d\n", i);
                ++i;
        }

        return 0;
}
yanyg@yvit ~$ gcc -o test test.c -lpthread
yanyg@yvit ~$ ./test
Before mutex_lock... 1
After mutex_lock... 1
Before mutex_lock... 2
Now i'll try to unlock ... 1
After mutex_lock... 2
Before mutex_lock... 3
Now i'll try to unlock ... 2
After mutex_lock... 3
Before mutex_lock... 4
Now i'll try to unlock ... 3
After mutex_lock... 4
Before mutex_lock... 5

“过度优化”一节的描述:

所有论述的结果表达的含义是加锁也不能保证多线程安全,需要添加内存屏障。这真实从何谈起。哪位在开发用户程序时在锁之外还添加内存屏障了?

对于Linux实现互斥锁而言,如果无法获取mutex,则执行系统调用sys_futex,sys_futex自会保障有序性,换句话说,保证有序是lock的份内责任。

否则,何谈多线程同步开发?

其关于双检测的说法也犯了同样的错误。


ps, 我在wiki上查看mutex定义,也没看出定义中或者实现上有这个限制:

In computer science, mutual exclusion refers to the problem of ensuring that no two processes or threads (henceforth referred to only as processes) can be in their critical section at the same time. Here, a critical section refers to a period of time when the process accesses a shared resource, such as shared memory. The problem of mutual exclusion was first identified and solved by Edsger W. Dijkstra in his seminal 1965 paper titled: Solution of a problem in concurrent programming control.

也有可能windows平台的实现另有玄机吧?

------

此外,作者对于三种线程模型的看法,与我颇有差异,不过此处无硬伤,不提也罢了。
《程序员的自我修养——链接、装载与库》读书笔记(1) 这两天看了《程序员的自我修养——链接、装载与库》一书的前三章,感觉还是很有收获的。虽然这本书对于开发一个现成的app来说,貌似没什么作用,但对于理解一个系统软件到底是如何从高级语言代码到跑在硬件上的程序还是很有帮助的。大部分人都知道我们写的代码要经过预处理、编译、汇编成目标文件,然后经过链接生成最终的可执行文件,但是细节上是怎么一回事就懒得管了。编译的过程我还算有点了解,什么词法分析、语法分析、语... 阅读详情

相关推荐

《程序员的自我修养--链接、装载与库》笔记

1.6.1 线程基础 一个进程通常由多个线程组成,各个线程之间共享程序的内存空间(包括代码段、数据段、堆等)及一些进程级的资源(如打开文件和信号)。经典的线程与进程的关系图: 线程中的访问权限 线程中的私有存储: 栈 线程局部存储(Thread Local Storage,TLS) 寄存器(包括PC寄存器) 从C的角度看: 1.6.2 线程安全 同步与锁 所谓同步,是指一个线程访问数据未结束时,其他线程不得对同一个数据进行访问。 同步最常用的方法是锁。 二元信号量: 最简单的一种锁,只有两种状态:占

AnChenliang_1002的博客 2396

程序员的自我修养——链接,装载与库

章节目录 静态链接 – 编译和链接 – 目标文件 – 静态链接 – windows COFF 装载和动态链接 – 可执行文件的装载与进程 – 动态链接 – Linux共享库的组织 – Windows下的动态链接 库与运行库 – 内存 – 运行库 – 系统调用与API – 运行库实现 编译和链接 从hello_world.c 到可执行文件(executable file),经历了编译、链接过程。这个过程分为4步: 预处理 Prepressing 编译 Compilation, Compile

hua0918xing的博客 3571

08-SD卡-TF卡硬件电路设计

SD卡-TF卡硬件电路设计

weixin_66510961的博客 8258

程序员的自我修养_装载、链接与库_第一部分

【代码】程序员的自我修养_装载、链接与库_第一部分。

weixin_45806011的博客 765

智能车竞赛飞檐走壁组立体赛道电磁引导线设计与实现

本文深入解析了智能车竞赛飞檐走壁组立体赛道电磁引导线的核心设计与实现。针对垂直面、圆筒、跷跷板等立体元素,详细阐述了电磁线规格参数选择、三维空间铺设技巧及磁场调试方法,旨在帮助参赛队伍打造稳定可靠的导航系统,提升车模在复杂立体赛道上的通过率与稳定性。

bert9linguist的博客 279

IEEE投稿完整流程——以IEEE Transactions on Cybernetics为例【附:论文格式模板】

前言 以下是官方的流程,包括了论文的格式和提交的流程,重要!重要!重要! 在IEEE的官网中,也有论文提交的文件 可以直接参考: 中文版: 作者指南 英文版: Manuscripts-Author-Guide 作者指南的版本指导流程可能和最新版的官网不一致!!! 或者在下面的链接中,按照你的论文类型,选择不同的论文模板: IEEE article template 以下以IEEE Transactions on Cybernetics 为例子 IEEE Transactions on Cyberne

XC___XC的博客 10万+

程序员的自我修养--链接、装载与库

 中国科学技术大学软件学院 周艾亭 原创作品版权所有转载请注明出处 第一次接触《程序员的自我修养》的时候,的确怀有一种疑惑的态度的。因为潜意识告诉我:在计算机这一行,更强调的是实践动手,而XXX修养的显然不属于动手操作类,至少不是太适合我的需求。但是,当我以一种随意的心态翻阅的时候,我才发现我的判断是多么的幼稚! 这是一本深入浅出、通俗易懂的权威教...

weixin_30642305的博客 359

scRNA-seq的fastq文件处理流程——持续更新

获得了一批新的scRNA-seq的fastq.gz文件,每个样本的数据形式为: 我打算使用10X cellranger处理fastq.gz文件,下载及安装方式在官网:https://support.10xgenomics.com/single-cell-gene-expression/software/downloads/2.0这个网址写了10X cellranger处理fastq.gz文件的命名规则https://support.10xgenomics.com/single-cell-gene-expr

watermel__的博客 3198

程序员的自我修养-链接、装载与库(一、二)

程序员的自我修养:链接、装在与库 基础:1、计算机核心部件:CPU、内存和I/O控制芯片;高速的北桥:CPU、内存和高速的图形设备。低速的南桥:磁盘、USB、键盘、鼠标等,汇总链接到北桥上。 2、计算机系统的软件体系结构的设计是分层次的,每个层次之间需要相互的通信,互相通信就需要协议,我们称其为接口。应用程序和操作系统内核通过中间的桥梁系统调用接口进行交互,系统调用是通过中断来实现的。操作系统的功能是:提供抽象的接口和控制硬件的资源。 3、硬件驱动程序作为操作系统内核的一部分对硬件进行管理。硬盘的

dingyahui的博客 1112

QWEN 2.5模型结构解析与代码解读

对Qwen2.5大模型的代码进行研究

4362

数字IC后端层次化Hierarchical Flow子系统Sub-System模块 block partition和pin assignment细节盘点

数字IC后端培训教程之Hierarchical Flow子系统block partition和pin assignment详细教程

weixin_37584728的博客 1603

论文-分布式-并发控制-并发控制问题的解决方案

论文-分布式-并发控制-并发控制问题的解决方案

汤键的博客 2473

ansys非线性分析中接触类型

不分离(No Separation)‌:法向始终保持接触不分离,切向允许自由滑动,属于线性接触,适合需要法向约束、允许微小切向位移的场景,比如过盈配合的简化模拟。有摩擦(Frictional)‌:法向允许分离,切向根据用户设置的摩擦系数计算摩擦力,是工程中最符合实际机械接触的类型,绝大多数装配体分析都选择该类型。无摩擦(Frictionless)‌:法向允许接触面分离,切向无摩擦、允许自由滑动,适合模拟理想润滑的光滑接触面,图中当前选择的就是该类型。非线性接触(需要多次迭代,属于真正的非线性接触行为)‌。

qq_15963745的博客 71

【免费下载】 程序员的自我修养—链接、装载与库

程序员的自我修养—链接、装载与库 【下载地址】程序员的自我修养链接装载与库 程序员的自我修养—链接、装载与库 项目地址: https://gitcode.com/Open-source-documentation-tutorial...

gitblog_06683的博客 1901

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块03 导弹飞行工具应用案例

飞行设置的工具栏就在附加窗口的中间,首先点击左边的General,修改这个项目的名字。然后在下拉的System中选择导弹的类型,这里我们选择远程。(4)输出数据文件到STK,任务窗口里选择Export Manager项,飞行数据输出到STK。项目可以命名为Test;(1)首先建立新项目,点击Flight菜单中的New Flight选项,见下图。首先看世界地图中间的红圈,是一个导弹形状的图标,这个图标表示的是导弹的发射点。选择下面的Export Manager,依次勾选红框的选项。我们拖动这个导弹的图标,

weixin_44184852的博客 1630

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

《程序员的自我修养——链接、装载与库》勘误

《程序员的自我修养——链接、装载与库》2010年3月第5次印刷电子工业出版社这本书确实不错,刚看完一遍,有很多收获。有一些自己觉得是错误的地方指出来,望对他人有用。1.  P51.图2-8链接过程:原:Propressing 。应改为:Preprocessing2.P60.第二段第二行:  原:保存一份改程序的指令部分。应改为:保存一份该程序的指令部分。3.P85.第六行:  原:它被定义在.bs

程序之美 2506

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《程序员的自我修养:链接、装载与库》读书笔记:静态链接、动态链接

静态链接、动态链接,目标文件的内容

阿正的梦工坊 1470

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

程序员的自我修养 --- 链接、装载与库

程序员的自我修养 此书正在阅读中,笔记持续更新。。。 回顾 1、线程 (1)什么是线程 轻量级进程 由线程ID、当前指令指针、寄存器集合、堆栈组成 一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段、数据段、堆等)以及一些进程级的资源(如打开文件和信号) (2)单线程 &amp; 多线程 ① 使用多线程的原因 ② 多线程模型 一对...

Μῆτις -- chengfengYang_LMN 759

程序员的自我修养—链接、装载与库 笔记

程序员的自我修养—链接、装载与库 笔记目标文件静态链接编译和链接过程动态链接装载过程函数调用过程系统调用过程堆栈 目标文件 静态链接 编译和链接 过程 动态链接 装载 过程 函数调用过程 系统调用过程 堆栈 ...

Yang_137476932的博客 3793

《程序员的自我修养—链接、装载与库》pdf书签,目录分享

在网上下载到《程序员的自我修养—链接、装载与库》pdf版本,拜读之后受益匪浅,但是因为下载的pdf没有书签,所以想要查找某一章的内容不是很方便,于是自己制作了一下书签文件,将书签文件导入pdf,就可以自动生成pdf书签啦! 书签文件: 链接:https://pan.baidu.com/s/1aeky9Iy0ztS_Z3Iyl-I4RQ 提取码:tz2r 书签文件的使用方式可以看我的另一篇文章。 https://blog.youkuaiyun.com/jerry741/article/details/11844.

gitcat的博客 7368

程序员的自我修养——链接、装载与库

学习笔记

qq_31220203的博客 6984

程序员的自我修养--链接、装载与库笔记:总结

《程序员的自我修养----链接、装载与库》这本书是2009年出版的,书中有些内容的介绍可能已经过时,已不再适用于现在的C/C++开发,而且书中展示的结果均是在32位机上进行的操作,这里全部是在64位进行的操作。 这里是基于之前所有笔记的简单总结,笔记列表如下: 编译和链接:https://blog.youkuaiyun.com/fengbingchun/article/details/88699951 ...

网络资源是无限的 6450

《程序员的自我修养--链接、装载与库》第一章阅读笔记

《程序员的自我修养–链接、装载与库》第一章阅读笔记 Terry.Tang 原创作品转载请注明出处 《程序员的自我修养–链接、装载与库》阅读笔记1/13 2017/4/18一.基本概念回顾计算机软硬件体系中的几个重要概念,在计算机繁多的硬件设备中,三个部件最为关键:重要处理器CPU、内存和I/0控制芯片。而我们程序员的目的就是充分利用这三个部分。 南北桥结构 1.设计原因:分

Eijsan 551

《程序员的自我修养——链接、装载与库》读后感

在学长的推荐下读了这本书——《程序员的自我修养——链接、装载与库》,之前大四的时候从图书馆借过一次,但是草草翻阅几页也没有再继续读下去。读这本书的过程很奇妙,就像是在回顾之前的操作系统和编译原理课,尤其是编译原理,合理猜测我当年的本科老师是按照这本书的很多内容在讲课,这种夹杂着微妙熟悉感的阅读体验还是很不错的,同时也对于C语言有了一个彻彻底底的回顾和认知。考虑到本书的作者俞甲子著书的时候也是研一,和我一般大的年纪,不禁为自己有些汗颜。学无止境,山外有山,希望自己能够继续不断前行,不断学习,不断进步!

XLYcmy的博客 366
上一篇: GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (2) 多目录和动态链接库
cppgp
博客等级 码龄20年 47粉丝 46原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值