#—
title: Go:defer 语句如何工作 date: 2021-04-05 11:55:28 tags: [go] categories: [go]
Go:defer 语句如何工作
ℹ️ 这篇文章基于 Go 1.12。
defer 语句是在函数返回前执行一段代码的便捷方法,如 Golang 规范所描述:
Go:defer 语句如何工作
ℹ️ 这篇文章基于 Go 1.12。
defer 语句是在函数返回前执行一段代码的便捷方法,如 Golang 规范所描述:
在《Go精妙的互斥锁设计》一文中,我们详细地讲解了互斥锁的实现原理。互斥锁为了避免竞争条件,它只允许一个线程进入代码临界区,而由于锁竞争的存在,程序的执行效率会被降低。同时我们知道,只有多线程在共享资源中有写操作,才会引发竞态问题,只要资源没有发生变化,多线程读取相同的资源就是安全的。因此,我们引申出更细粒度的锁:读写锁。
什么是读写锁
读写锁是一种多读单写锁,分读和写两种锁,多个线程可以同时加读锁,但是写锁和写锁、写锁与读锁之间是互斥的。
读写锁对临界区的处理如上图所示。其中,t1时刻,由于线程1已加写锁,线程2被互斥等待写锁的释放;t2时刻,线程2已加读锁,线程3可以对其继续加读锁并进入临界区;t3时刻,线程3加了读锁,线程4被互斥等待读锁的释放。
本文是《go调度器源代码情景分析》系列 第一章 预备知识的第九小节。
要深入理解goroutine的调度器,就需要对操作系统线程有个大致的了解,因为go的调度系统是建立在操作系统线程之上的,所以接下来我们对其做一个简单的介绍。
When you install Ubuntu, it asks you to set timezone. If you chose a wrong timezone or if you have moved to some other part of the world, you can easily change it later.
There are two ways to change the timezone in Ubuntu. You can use the graphical settings or use the timedatectl command in the terminal. You may also change the /etc/timezone file directly but I won’t advise that.
听着《梦中的额吉》,《天堂》…女儿在睡觉…外面细雨…中秋小长假,完成自己的OpenVPN patch 编码中充满了快乐!前提是你知道自己在做什么! OpenVPN不给力,虽然它给出了N多的Renegotiate选项,然则其实现却不尽人意。难道设计者以为我们众人就这么好忽悠吗?
别的就不多说什么了,前面的文章说过,OpenVPN有两个瓶颈,一个是tap网卡,另一个是加密/解密 ,然而不可否认,OpenVPN的客户端和服务器端处于一个“虚拟网段”,抛开虚拟不谈,只要是一个网段的,我们就可以说它们属于一个局域网(当然前提是使用tcp/ip网络),既然属于一个局域网,那么它要么是广播的,要么是点对点的,不管怎样,两端都有确定的三层地址(IP地址),所有的数据包都是通过这个三层地址来传输到对端的,因此为了使得路径畅通,我们只关心路由即可。
测试命令:ab -k -c 8 -n 500 http://10.0.188.139/5m.html
机器部署:
S0:
eth0:192.168.188.194 mtu 1500 e1000e 1000baseT-FD flow-control
tun0:172.17.0.2 mtu 1500
route:10.0.188.139 dev tun0
S1:
eth0:192.168.188.193 mtu 1500 e1000e 1000baseT-FD flow-control
eth1:10.0.188.193 mtu 1500 e1000e 1000baseT-FD flow-control
tun0:172.16.0.1 mtu 1500
S2:
eth1:10.0.188.139 mtu 1500 e1000e 1000baseT-FD flow-control
route:172.17.0.0 gw 10.0.188.193
测试数据: OpenVPN配置:--cipher BF-CBC --auth SHA1