https://mp.weixin.qq.com/s/pVJiFdDDKVx707eKL19bjA 谈谈 Golang 中的 Data Race 原创 ms2008 poslua 2019-05-13 Any race is a bug 我在接手其他同事的 golang 项目时,一般都会习惯性的做一个竞态检测.有时总会得到一些"惊喜",比如像下面这段代码:   package main import ( "fmt" "runtime" "…
Introducing the Go Race Detector 26 June 2013 Introduction Race conditions are among the most insidious and elusive programming errors. They typically cause erratic and mysterious failures, often long after the code has been deployed to production. W…
竞态条件 race condition Race condition - Wikipedia https://en.wikipedia.org/wiki/Race_condition A race condition or race hazard is the condition of an electronics, software, or other system where the system's substantive behavior is dependent on the sequ…
从一次重构说起 这事儿还得从一次重构优化说起. 最近在重构一个路由功能,由于路由比较复杂,需求变化也多,于是想通过责任链模式来重构,刚好这段时间也在 Sentinel-Go 中看到相关源码. 用责任链模式,最大的好处是可以针对每次请求灵活地插拔路由能力,如: 这样实现会在每次请求到来时去 new 出整个责任链,可以预见对象会频繁的创建.销毁. 对 Java 来说,对象池并不推荐,除非对象的创建特别费力,像一个连接对象,否则线程之间的锁竞争绝对比直接分配内存的消耗要多的多~ 但 Go 不一样,它内…
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本质上说,goroutine的使用增加了函数的危险系数论go语言中goroutine的使用.比如一个全局变量,如果没有加上锁,我们写一个比较庞大的项目下来,就根本不知道这个变量是不是会引起多个goroutine竞争. 官网的文章Introducing the Go Race Detector给出的例子…
Data Race Detector 数据种类探测器:数据种类探测器手册 Introduction Usage Report Format Options Excluding Tests How To Use Typical Data Races Race on loop counter Accidentally shared variable Unprotected global variable Primitive unprotected variable Supported Systems…
小结: 1. conflicting access 2.性能危害 优化 The cost of race detection varies by program, but for a typical program, memory usage may increase by 5-10x and execution time by 2-20x. 3.典型案例与修复 Accidentally shared variable // ParallelWrite writes data to file1…
我们都知道,在编写多线程程序时,我们应该记住很多细节,比如锁,使用线程安全库等.这里有一个不太明显的bug的列表,特定于多线程程序.其中许多都没有在初学者的文档或教程中提到,但我认为每个使用线程的人最终都会中枪. 使用thead safe系统函数 并非所有的系统函数或者库函数都能被安全地使用.最明显的例子之一是strtok(3),它执行字符串符号化.它在每次调用中返回下一个token,并使用全局状态来保持源字符串中的当前位置.当您阅读此函数的手册页时, 您将看到有thread-safe版本:st…
使用C/C++编程时,常使用ZeroMemory.memset或 “={0}”来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机的bug,查了几小时,才发现是由同事乱用ZeroMemory所致.于是搜集资料,撰此文以共勉. memset void *memset(void *s,int ch,size_t n); 是由C Run-time Library提供的提供的函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构…
What is ZooKeeper? (译:什么是ZooKeeper?) ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. (译:ZooKeeper是一个为 维护配置信息.命名.同步分布式 和 组服务 提供服务的 集中服务.) All of…
本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对单元测试),包括基本技术.高级技术(并发测试.mock/fake.竞争条件测试.并发测试.内/外部测 试.vet工具等)等,感觉总结的很全面,这里整理记录下来,希望能给大家带来帮助.原Slide访问需要自己搭梯子.另外这里也要吐槽一 下:Golang官方站的slide都是以一种特有…
最新在整体回归下java基础薄弱环节,以下为自己整理笔记,若有理解错误,请批评指正,谢谢. java.lang.Object为java所有类的基类,所以一般的类都可用重写或直接使用Object下方法,以下为逻辑结构图,没有画类图 (注: 以上绿色方法为 非native方法  粉色方法为 native方法) 那么问题来了 : 1.what is a native object? 本人理解: native关键字标识的java方法为本地方法,底层是有c/c++编写的程序编译后dll文件,java加载d…
Golang单元测试对文件名和方法名,参数都有很严格的要求. 例如: 1.文件名必须以xx_test.go命名 2.方法必须是Test[^a-z]开头(T必须大写),func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z],例如Testintdiv是错误的函数名. 3.方法参数必须 t *testing.T 4.测试用例会按照源代码中写的顺序依次执行 5.函数中通过调用testing.T的Error, Errorf, Fai…
linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和Linux API进行应用软件的编写: 从事这方面的开发工作,主要需要学习:符合linux posix标准的API函数及系统调用,linux的多任务编程技巧:多进程.多线程.进程间通信.多任务之间的同步互斥等,嵌入式数据库的学习,UI编程:QT.miniGUI等. (2)Linux固件工程师(Fir…
使用C/C++编程时,常使用ZeroMemory.memset或 “={0}”来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机的bug,查了几小时,才发现是由同事乱用ZeroMemory所致.于是搜集资料,撰此文以共勉. memset void *memset(void *s,int ch,size_t n); 是由C Run-time Library提供的提供的函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构…
Go 1.8 Release Notes Introduction to Go 1.8 Changes to the language Ports Known Issues Tools Assembler Yacc Fix Pprof Trace Vet Compiler Toolchain Cgo Gccgo Default GOPATH Go get Go bug Go doc Plugins Runtime Argument Liveness Concurrent Map Misuse M…
前言 最近看到了一些以 at 结尾的Linux系统调用,在维基百科上面说这可以防御一些特定的TOCTTOU攻击,而在TOCTTOU对应页面中并没有中文版的介绍,而且百度的结果也比较少,于是决定抽空写一个关于 TOCTTOU攻击的简介,其中部分参考了英文版的维基百科. 什么是竞争条件与TOCTTOU? 在电路设计.软件开发.系统构建中,如果一个模块的输出与多个不可控事件发生的先后时间相关,则称这种现象为"竞争条件"(Race condition),又称"竞争冒险"(r…
1. 规范很重要      工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的.逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了:如果一个项目做了一半一个人走了,接班的估计得从头开始设计:如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性.在逻辑方面,我觉得比较重要的规范有这些: (1) 设计必须文档化      要将设计思路,详…
1)内存空间安全.2)参量级别数据安全:3)通信级别数据安全:4)数据访问控制:5)通信对象身份确认. https://developer.apple.com/library/content/documentation/Security/Conceptual/SecureCodingGuide/Articles/TypesSecVuln.html#//apple_ref/doc/uid/TP40002529-SW2 Most software security vulnerabilities f…
前言 在我前面一篇文章Golang受欢迎的原因中已经提到,Golang是在语言层面(runtime)就支持了并发模型.那么作为编程人员,我们在实践Golang的并发编程时,又有什么需要注意的点呢?下面我会跟大家详细的介绍一些在实际生产编程中很容易踩坑的知识点. CSP 在介绍Golang的并发实践前,有必要先介绍简单介绍一下CSP理论.CSP,全称是Communicating sequential processes,翻译为通信顺序进程,又翻译为交换消息的顺序程序,用来描述并发性系统的交互模式.…
简述 Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试. go test [-c] [-i] [build flags] [packages] [flags for test binary] 参数解读 -c : 编译go test成为可执行的二进制文件,但是不运行测试. -i : 安装测试包依赖的package,但是不运行测试. 关于build flags,调用go help build,这些是编译运行过程中需要使用到的参数,一般设置为空 关于…
深入理解android的UI更新机制 由问题开始: 如何更新android UI? 可以通过如下方法: 在主线程里直接操作UI控件. handler.post(Runnable) runOnUiThread(Runnable action) View.post(Runnable) Handler.sendMessage,在Handler handleMessage()方法里执行. 大家基本都知道这些方法,那么为什么要这么做? 我们把几个方法的源码都看一遍吧. 主线程,这个好像不能说为什么,他就是…
不安全的双检锁 从其他语言转入Go语言的同学经常会陷入一个思考:如何创建一个单例? 有些同学可能会把其它语言中的双检锁模式移植过来,双检锁模式也称为懒汉模式,首次用到的时候才创建实例.大部分人首次用Golang写出来的实例大概是这样的: type Conn struct { Addr string State int } var c *Conn var mu sync.Mutex func GetInstance() *Conn { if c == nil { mu.Lock() defer m…
维特比算法解决隐马尔可夫模型解码问题(中文句法标注) 作者:白宁超 2016年7月12日14:08:28 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场.直到学习自然语言处理时,才真正使用到隐马尔可夫模型,并体会到此模型的妙用之处.马尔可夫模型在处理序列分类时具体强大的功能,诸如解决:词类标注.语音识别.句子切分.字素音位转换.局部句法剖析.语块分析.命名实体识别.信息抽取等.另外广泛应用于自然科学.工程技术.生物科技.公用事业.信道编码等多个领域.…
What is a memory model, anyway? In multiprocessorsystems, processors generally have one or more layers of memory cache, whichimproves performance both by speeding access to data (because the data iscloser to the processor) and reducing traffic on the…
众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈.学习Git,首先当然是学习Git的基本工作流.相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生的强大工具.使用Git时常用的命令有pull.commit.push等,貌似很简单.不过,有时你会遇到合并冲突的情况,Git这时会将冲突标记出来,需要你手工来解决.有时,你会不小心将代码提交到错误的分支上,并且又推送到了远程仓库.还有些时候,你需要切换到不同的分支,但Git却不让你这么做,因为还有未保存…
准备工作 pip install PyYAML import yaml yaml语法规则 想要表示列表项,使用一个短横杠加一个空格.多个项使用同样的缩进级别作为同一列表的一部分 my_dictionary: - list_value_one - list_value_two - list_value_three 在Python中,上面的将映射为: {'my_dictionary': ['list_value_one', 'list_value_two', 'list_value_three']}…
ThreadSanitizer又叫TSan,是一个检查线程Data Race的C/C++工具.它集成在新版的gcc和clang中,通过编译时加-fsanitize=thread,可以在运行时检测出Data Race的问题. ThreadSanitizer官网:https://code.google.com/p/thread-sanitizer Data Race Data Race是指多个线程在没有正确加锁的情况下,同时访问同一块数据,并且至少有一个线程是写操作,对数据的读取和修改产生了竞争,从…
Season 1, Episode 22: Flight -Franklin: You know you got a couple of foxes in your henhouse, right? fox: 狐狸 henhouse: 鸡舍 你的队伍里都是一群狐狸 -Michael: They both want out of here. both: 两者都 他们都想出去 They'll behave until then. behave: 举止端正 出去前都会安分的 -Franklin: Lo…
What is AngularJS? AngularJS is a JavaScript MVC framework developed by Google that lets you build well structured, easily testable, and maintainable front-end applications. And Why Should I Use It? If you haven’t tried AngularJS yet, you’re missing…