read

Go 1.9 sync.Map揭秘

独自空忆成欢 提交于 2019-12-04 23:52:24
本文为转载, 原文链接 在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。 本文带你深入到sync.Map的具体实现中,看看为了增加一个功能,代码是如何变的复杂的,以及作者在实现sync.Map的一些思想。 有并发问题的map 官方的faq已经提到内建的map不是线程(goroutine)安全的。 首先,让我们看一段并发读写的代码,下列程序中一个goroutine一直读,一个goroutine一只写同一个键值,即即使读写的键不相同,而且map也没有"扩容"等操作,代码还是会报错。 package main func main() { m := make(map[int]int) go func() { for { _ = m[1] } }() go func() { for { m[2] = 2 } }() select {} } 错误信息是: fatal error: concurrent map read and map write。 如果你查看Go的源代码: hashmap_fast.go#L118

go sync.Map使用和介绍

非 Y 不嫁゛ 提交于 2019-12-04 23:50:18
sync.Map使用和介绍 1、首先看下该sync.Map的使用: package main import ( "sync" "fmt" ) func main() { //开箱即用 var sm sync.Map //store 方法,添加元素 sm.Store (1 , "a" ) //Load 方法,获得value if v,ok:=sm.Load (1 );ok{ fmt.Println(v) } //LoadOrStore方法,获取或者保存 //参数是一对key:value,如果该key存在且没有被标记删除则返回原先的value(不更新)和true;不存在则store,返回该value 和false if vv,ok:=sm.LoadOrStore (1 , "c" );ok{ fmt.Println(vv) } if vv,ok:=sm.LoadOrStore (2 , "c" );!ok{ fmt.Println(vv) } //遍历该map,参数是个函数,该函数参的两个参数是遍历获得的key和value,返回一个bool值,当返回false时,遍历立刻结束。 sm.Range( func (k,v interface {}) bool { fmt.Print(k) fmt.Print( ":" ) fmt.Print(v) fmt.Println() return

Redis之Read timed out

十年热恋 提交于 2019-12-04 22:24:35
Redis报错:redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out 问题描述: 在阿里云linux服务器上(最便宜的那种。。。),使用redis缓存实现点赞功能报错,由于对redis不够深入以为是配置文件的问题,忽略了代码。。 异常信息: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out at redis.clients.jedis.Protocol.process(Protocol.java:79) at redis.clients.jedis.Protocol.read(Protocol.java:131) at redis.clients.jedis.Connection.getIntegerReply(Connection.java:188) at redis.clients.jedis.Jedis.sismember(Jedis.java:1266) 问题解决: 使用完jedis之后执行close() 事例: public String set(String

ycsb 测试Hbase性能

陌路散爱 提交于 2019-12-04 20:47:46
下载 github: https://github.com/brianfrankcooper/YCSB/releases/tag/0.10.0 wget https://github.com/brianfrankcooper/YCSB/archive/0.10.0.tar.gz tar xvf 0.10.0.tar.gz 编译: cd YCSB-0.10.0/ 编译所有的nosql mvn clean package 只编译Hbase mvn -pl com.yahoo.ycsb:hbase10-binding -am clean package 安装成功。 cd hbase10/target/ tar xvf ycsb-hbase10-binding-0.10.0.tar.gz cd ycsb-hbase10-binding-0.10.0 测试: 1 hive中建表 hbase(main):01:0*> n_splits=120 => 120 hbase(main):02:0> create 'usertable','family',{SPLITS => (1...n_splits).map{|i| "user#{1000+i*(9999-1000)/n_splits}"}} 0 row(s) in 18.3610 seconds => Hbase::Table -

异步通知

帅比萌擦擦* 提交于 2019-12-04 18:51:00
① 轮询 :应用程序不断read;驱动程序不断read,占用大量的 cpu 资源。 ② 中断 :应用程序阻塞在read;驱动程序休眠,只有发生中断时,驱动程序唤醒,读取键值,返回给应用程序;应用程序执行下一步。 ③ poll :应用程序在一定的时间内(用户定义),不断检测用户设置的flag,超时执行下一步;驱动程序在发生中断时,标记用户设置的flag。 ④ async :应用程序不会阻塞,不影响当前进程的其他任务的执行,只有在接收到驱动程序发送过来的信号,才去读取键值;在发生中断时,驱动程序发送信 号给应用程序(通过进程号),通知应用程序读取键值。 当按键中断发生时,发送信号给应用程序,应用程序再去读取键值,避免进程阻塞在 read() 函数,提高系统运用效率。 实例 driver 1 #include <linux/module.h> 2 #include <linux/kernel.h> 3 #include <linux/fs.h> 4 #include <linux/init.h> 5 #include <linux/delay.h> 6 #include <linux/irq.h> 7 #include <asm/uaccess.h> 8 #include <asm/irq.h> 9 #include <asm/io.h> 10 #include <asm/arch

mmap:内存映射文件

心不动则不痛 提交于 2019-12-04 17:57:42
介绍 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。 内存映射通常可以提高I/O性能,因为使用内存映射时,不需要对每一个访问都建立一个单独的系统调用,也不需要你在缓冲区之间复制数据。实际上内核和用户应用都能直接访问内存。 内存映射文件可以看做是可修改的字符串或类似文件的对象,这取决于具体的需要。 映射文件支持一般文件的API方法,如close、flush、read、readline、seek、tell、write。他还支持字符串的API,提供切片等特性以及类似find的方法 。 读文件 import mmap ''' 使用mmap函数可以创建一个内存映射文件。第一个参数是文件描述符,可能来自file对象的fileno方法,也可能来自os.open。 调用者在调用mmap方法之前负责打开文件,不再需要文件时要负责将其关闭。 mmap函数的第二个参数是要映射的文件部分的大小(以字节为单位)。如果这个值为0,则映射整个文件,如果这个大小大于文件的当前大小,则会扩展该文件。 注意:Windows不支持长度为0的映射 ''' ''' 这两个平台都支持一个可选的参数access。使用ACCESS_READ表示只读访问;ACCESS_WRITE表示“写通过(write-through)”,即对内存的赋值直接写入文件; ACCESS

洛谷 P4568 [JLOI2011]飞行路线 题解

删除回忆录丶 提交于 2019-12-04 11:51:12
每日一题 day41 打卡 Analysis 分层图最短路模板 各层内部正常连边,各层之间从上到下连权值为0的边。每向下跑一层,就相当于免费搭一次飞机。跑一遍从 s 到 t+n*k 的最短路即可。 三倍经验 洛谷 P4822 [BJWC2012]冻结,洛谷 P1948 [USACO08JAN]电话线Telephone Lines,洛谷 P2939 [USACO09FEB]改造路Revamping Trails 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #define maxn 4200000+10 7 #define INF 9187201950435737471 8 #define rep(i,s,e) for(register int i=s;i<=e;++i) 9 #define dwn(i,s,e) for(register int i=s;i>=e;--i) 10 using namespace std; 11 inline int read() 12 { 13 int x=0; 14 bool f=1; 15 char c=getchar(); 16 for(; !isdigit(c); c=getchar()

Read Uncommitted

痞子三分冷 提交于 2019-12-04 11:35:52
Read Uncommitted是隔离级别最低的一种事务级别。在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。 我们来看一个例子。 首先,我们准备好 students 表的数据,该表仅一行记录: 直线电机怎么选择 mysql> select * from students; +----+-------+ | id | name | +----+-------+ | 1 | Alice | +----+-------+ 1 row in set (0.00 sec) 然后,分别开启两个MySQL客户端连接,按顺序依次执行事务A和事务B: 时刻 事务A 事务B 1 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 2 BEGIN; BEGIN; 3 UPDATE students SET name = 'Bob' WHERE id = 1; 4 SELECT * FROM students WHERE id = 1; 5 ROLLBACK; 6 SELECT * FROM students WHERE id = 1; 7 COMMIT

简单了解node stream

巧了我就是萌 提交于 2019-12-04 09:52:12
Almost all Node.js applications, no matter how simple, use streams in some manner. 开篇先吓吓自己。画画图,分析分析代码加深自己的理解。 简单了解node stream stream基本概念 Writable - 可写入数据的流 Readable - 可读取数据的流 node中其它模块stream 的应用 总结 1.stream基本概念 1.1什么是 stream 1. 在编写代码时,我们应该有一些方法将程序像连接水管一样连接起来 -- 当我们需要获取一些数据时,可以去通过"拧"其他的部分来达到目的。这也应该是IO应有的方式。 -- Doug McIlroy. October 11, 1964 结合到node中 stream 就像是一个抽象的模型(有点像水管),能有序的传输数据(有点像水),需要时就拧开水管取点用,还可以控制大小。 Node.js 中有四种基本的流类型: Writable - 可写入数据的流(例如 fs.createWriteStream())。 Readable - 可读取数据的流(例如 fs.createReadStream())。 Duplex - 可读又可写的流(例如 net.Socket)。 Transform - 在读写过程中可以修改或转换数据的 Duplex 流(例如

STM32F4 MDK5软件仿真 error : no \'read\' permission

旧城冷巷雨未停 提交于 2019-12-04 07:51:29
(一)参考文献: STM32F4 MDK5软件仿真 error : no 'read' permission (二)转载: 问题描述 CPU:STM32F407 MDK5软件模拟提示没有读写权限,只能一步一步运行。提示代码如下: *** error 65: access violation at 0x40023800 : no 'read' permission *** error 65: access violation at 0x40023800 : no 'write' permission *** error 65: access violation at 0x40023808 : no 'write' permission *** error 65: access violation at 0x40023800 : no 'read' permission *** error 65: access violation at 0x40023800 : no 'write' permission 解决方法 增加map地址空间权限映射。 根据网络资源介绍方法大致有三种: 1.修改工程配置选项中的debug选项卡,STM32F1系列芯片验证可以正常使用。F4系列芯片不能正常使用。 2.直接在调试页面修改map地址权限映射,正常修改后程序可正常运行。退出调试时需要重新设置