atomic

聊聊gost的GoSafely

梦想的初衷 提交于 2021-02-17 11:41:33
序 本文主要研究一下gost的GoSafely GoSafely gost/runtime/goroutine.go func GoSafely(wg *sync.WaitGroup, ignoreRecover bool, handler func(), catchFunc func(r interface{})) { if wg != nil { wg.Add(1) } go func() { defer func() { //...... }() handler() }() } GoSafely接收WaitGroup、ignoreRecover、handler、catchFunc参数,其大致的模板是,首先对WaitGroup进行add(1),然后一步执行带defer的handler defer gost/runtime/goroutine.go defer func() { if r := recover(); r != nil { if !ignoreRecover { fmt.Fprintf(os.Stderr, "%s goroutine panic: %v\n%s\n", time.Now(), r, string(debug.Stack())) } if catchFunc != nil { //...... } } if wg != nil { wg.Done()

C++ atomic CAS(compare-and-swap) operation does not change value

*爱你&永不变心* 提交于 2021-02-17 03:44:34
问题 In the following example, what actually happens? Why value does not changes after successful exchange? Live: https://wandbox.org/permlink/f5VYSKfQ9UJqa8FQ std::atomic<bool> flag{false}; int main() { std::thread thread([](){ while(true){ // wait until flag not becomes true { bool expect = true; while(!flag.compare_exchange_strong(expect, false, std::memory_order_acq_rel)){ std::cout << "wait" << std::endl; } } std::cout << "work" << std::endl; } }); flag.store(true, std::memory_order_release);

锁和分布式锁

余生颓废 提交于 2021-02-17 01:59:24
锁的由来 : 多线程环境中,经常遇到多个线程访问同一个 共享资源 ,这时候作为开发者必须考虑如何维护数据一致性,这就需要某种机制来保证只有满足某个条件(获取锁成功)的线程才能访问资源,而不满足条件(获取锁失败)的线程只能等待,在下一轮竞争中来获取锁才能访问资源。 两个知识点: 1.高级缓存Cache CPU为了提高处理速度,不和内存直接进行交互,而是使用Cache。 可能引发的问题: 如果多个处理器同时对共享变量进行读改写操作 (i++就是经典的读改写操作),那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的了,操作完之后共享变量的值会和期望的不一致。 造成此结果的原因: 多个处理器同时从各自的缓存中读取变量i,分别进行加1操作,然后分别写入 系统内存中。 处理器层面的解决方案: 处理器使用总线锁就是来解决这个问题的。所谓总线锁就是使用处理器提供的一个 LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。 2.CAS(Compare And Swap)+volatile CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。执行CAS操作的时候,将内存位置的值与预期原值比较,如果相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。

pread and pwrite not defined?

爱⌒轻易说出口 提交于 2021-02-16 20:22:29
问题 I am trying to use pread and pwrite so that I can lseek to the beginning of the file and start reading or writing in one atomic operation. Both of these functions will do that for me however, the issue I am having is that the compiler is giving me warning: implicit declaration of function ‘pread’ even after I added #define _XOPEN_SOURCE 500 and #include<unistd.h> like the man pages said. Am I missing something? The two statements with the function calls are below. Thanks! #include<unistd.h>

pread and pwrite not defined?

﹥>﹥吖頭↗ 提交于 2021-02-16 20:20:50
问题 I am trying to use pread and pwrite so that I can lseek to the beginning of the file and start reading or writing in one atomic operation. Both of these functions will do that for me however, the issue I am having is that the compiler is giving me warning: implicit declaration of function ‘pread’ even after I added #define _XOPEN_SOURCE 500 and #include<unistd.h> like the man pages said. Am I missing something? The two statements with the function calls are below. Thanks! #include<unistd.h>

Why does the initialisation of an object invoke the copy constructor?

梦想与她 提交于 2021-02-16 16:10:40
问题 Consider the following minimal working example: #include <atomic> int main() { ::std::atomic<bool> a = false; } Copy ctor and copy assignment of atomic are both explicitly deleted. However, this should invoke the ctor taking exactly a bool. Both g++ and clang++ complain that this line is attempting to invoke the copy ctor of atomic : $ g++ -std=c++1z a.cpp a.cpp: In function ‘int main()’: a.cpp:4:27: error: use of deleted function ‘std::atomic<bool>::atomic(const std::atomic<bool>&)’ ::std:

memory_order_relaxed and visibility

这一生的挚爱 提交于 2021-02-15 07:36:51
问题 Consider two threads, T1 and T2, that store and load an atomic integer a_i respectively. And let's further assume that the store is executed before the load starts being executed. By before, I mean in the absolute sense of time. T1 T2 // other_instructions here... // ... a_i.store(7, memory_order_relaxed) // other instructions here // other instructions here // ... a_i.load(memory_order_relaxed) // other instructions here Is it guaranteed that T2 sees the value 7 after the load? 回答1: Is it

Linux并发与同步专题 (1)原子操作和内存屏障

跟風遠走 提交于 2021-02-15 03:39:45
关键词:。 《 Linux并发与同步专题 (1)原子操作和内存屏障 》 《 Linux并发与同步专题 (2)spinlock 》 《 Linux并发与同步专题 (3) 信号量 》 《 Linux并发与同步专题 (4) Mutex互斥量 》 《 Linux并发与同步专题 (5) 读写锁 》 《 Linux并发与同步专题 (6) RCU 》 《 Linux并发与同步专题 (7) 内存管理中的锁 》 《 Linux并发与同步专题 (8) 最新更新与展望 》 1. 原子操作 1.1 一个原子操作例子思考 1.2 原子操作API atomic_t数据结构表示原子变量,它的实现依赖于不同的体系结构。 typedef struct { int counter; } atomic_t; Linux提供了很多操作原子变量的API。以arch/arm/include/asm/atomic.h为例。 #define ATOMIC_INIT(i) { (i) }----------------------------------声明一个原子变量并初始化为i。 #define atomic_read(v) ACCESS_ONCE((v)->counter)----------------读取原子变量的值。 #define atomic_set(v,i) (((v)->counter) = (i))-----

Go语言基础之并发

痞子三分冷 提交于 2021-02-13 06:20:25
Go语言基础之并发 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。 并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。 Go语言的并发通过 goroutine 实现。 goroutine 类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个 goroutine 并发工作。 goroutine 是由Go语言的运行时调度完成,而线程是由操作系统调度完成。 Go语言还提供 channel 在多个 goroutine 间进行通信。 goroutine 和 channel 是 Go 语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。 goroutine 在java/c++中我们要实现并发编程的时候,我们通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务和然后自己去调度线程执行任务并维护上下文切换,这一切通常会耗费程序员大量的心智。能不能有一种机制,程序员只需要定义很多个任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行呢? Go语言中的goroutine就是这样一种机制,goroutine 的概念类似于线程,但 goroutine 由

Go语言基础之并发

情到浓时终转凉″ 提交于 2021-02-13 05:30:36
[TOC] 更新、更全的《Go从入门到放弃》的更新网站,更有python、go、人工智能教学等着你: https://www.cnblogs.com/nickchen121/p/11517502.html <p>并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。</p> 一、Go语言中的并发编程 二、并发与并行 <p>并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。</p> <p>并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。</p> <p>Go语言的并发通过<code>goroutine</code>实现。<code>goroutine</code>类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个<code>goroutine</code>并发工作。<code>goroutine</code>是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。</p> <p>Go语言还提供<code>channel</code>在多个<code>goroutine</code>间进行通信。<code>goroutine</code>和<code>channel</code>是 Go 语言秉承的 CSP(Communicating Sequential Process