atomic

Segfault in std::atomic load?

╄→尐↘猪︶ㄣ 提交于 2021-01-27 04:27:28
问题 On linux, using gcc 4.8.4, compiled with -std=c++11 -mcx16: #include <atomic> struct node_t; struct pointer_t { node_t* ptr; unsigned int count; pointer_t() noexcept : ptr{nullptr}, count{0} {} }; struct empty {}; struct node_t { empty value; std::atomic<pointer_t> next; node_t() : next{pointer_t{}} {} }; int main() { node_t{}.next.load(); return 0; } gives a segfault when load is called. How am I meant to initialize an atomic value? 回答1: Turns out this is a bug in gcc that has since been

For purposes of ordering, is atomic read-modify-write one operation or two?

痴心易碎 提交于 2021-01-22 06:18:01
问题 Consider an atomic read-modify-write operation such as x.exchange(..., std::memory_order_acq_rel) . For purposes of ordering with respect to loads and stores to other objects, is this treated as: a single operation with acquire-release semantics? Or, as an acquire load followed by a release store, with the added guarantee that other loads and stores to x will observe both of them or neither? If it's #2, then although no other operations in the same thread could be reordered before the load or

Zookeeper面试常见的11个连环炮

核能气质少年 提交于 2021-01-18 22:55:48
面试的时候,面试官只要看到你简历的上写的有Zookeeper(熟悉、掌握)之类,那你至少要准备接下来的11连问。 NO1:说说zookeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现(Chubby是不开源的),它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户 。 Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下: NO2:了解Zookeeper的系统架构吗? ZooKeeper 的架构图中我们需要了解和掌握的主要有: (1)ZooKeeper分为服务器端(Server) 和客户端(Client),客户端可以连接到整个 ZooKeeper服务的任意服务器上(除非 leaderServes 参数被显式设置, leader 不允许接受客户端连接)。 (2)客户端使用并维护一个 TCP 连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送心跳。如果这个 TCP 连接中断

第一章 ·绪论 总结

瘦欲@ 提交于 2021-01-15 03:40:11
1.1什么是数据结构 ·数据结构是一门研究非数值计算的程序设计问题中计算机操作对象以及它们之间的关系和操作等的学科。 1.2基本概念和术语 1、四个定义: ·数据data:对客观事物的符号表示,是计算机科学中 所有能输入到计算机中并被计算机程序处理的 符号的总称。 ·数据元素data element:是 数据的基本单位 ,通常作为整体进行考虑,一个数据元素能有若干个数据项组成。 数据项是数据的不可分割的最小单位 。 ·数据对象data object:性质相同数据元素的集合,是数据的一个子集。 ·数据结构data structure:是相互之间存在一种或多种特定关系的数据元素的集合。 2、根据数据元素之间关系的不同特性可将结构分为四类基本结构:集合、线性结构、树形结构、图状结构或网状结构。 3、数据结构的形式定义: Data_Structure = (D,S) //D为数据元素的有限集,S为D上关系的有限集。   eg:Complex = (C,R) 其中 C={c1,c2};R={P},而P是定义在集合C上的一种关系{<c1,c2>},有序偶<c1,c2>表示c1是复数的实部,c2是复数的虚部。   ·结构定义为数据元素之间的关系,而这里的关系描述的是数据元素之间的逻辑关系,因此也称为数据的逻辑结构。   ·数据结构在计算机中的表示(又称为映像)成为数据的物理结构或存储结构

【iOS 底层】GCD源码分析 单例&信号量&调度组

大憨熊 提交于 2021-01-15 02:14:36
Pre 源码分析版本: libdispatch-1173.100.2 GCD - 单例 老规矩分析之前带着问题: GCD如何保证单例中的代码只执行一次? 如果多次调用会有什么结果? 基本使用 //将token用static修饰可以保证其在整个程序生命周期都保持不被销毁 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@""); }); 开始往里走! void //实际调用的是下面这个方法。此处只留下关键部分。 dispatch_once_f(dispatch_once_t *val, void *ctxt, dispatch_function_t func) { // 1. 初始化一个dispatch_once_gate_t结构体l dispatch_once_gate_t l = (dispatch_once_gate_t)val; /* 2. 取l中的dgo_once和acquire字符串传入os_atomic_load函数处理得到v值 * 尝试过进宏定义去看,但是实在走不下去了 *大概就是创建了一个对象并存储 *如果执行过则返回1,没执行过返回0 */ uintptr_t v = os_atomic_load(&l->dgo_once, acquire); /* *3.1 若v的值为1

100道Java并发和多线程基础面试题大集合(含解答),这波面试稳了~

删除回忆录丶 提交于 2021-01-14 17:59:19
# 前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了100个多线程的问题。 这些多线程的问题来源于各大网站,可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 整理了一份Java面试宝典完整版PDF # 100个问题汇总 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞

线程安全性详解(原子性、可见性、有序性)

廉价感情. 提交于 2021-01-14 15:59:01
一、定义:什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用 何种调度方式 或者这些进程将如何交替执行,并且在主调代码中 不需要任何额外的同步或协同 ,这个类都能表现出 正确的行为 ,那么就称这个类就是线程安全的。 二、线程安全性的三个体现 原子性 :提供互斥访问,同一时刻只能有一个线程对数据进行操作(Atomic、CAS算法、synchronized、Lock) 可见性 :一个主内存的线程如果进行了修改,可以及时被其他线程观察到(synchronized、volatile) 有序性 :如果两个线程不能从 happens-before原则 观察出来,那么就不能观察他们的有序性,虚拟机可以随意的对他们进行重排序,导致其观察观察结果杂乱无序(happens-before原则) 三、线程安全性:原子性 3.1、原子性 — Atomic包 在Java jdk中里面提供了很多Atomic类 AtomicXXX:CAS、Unsafe.compareAndSwapInt AtomicLong、LongAdder AtomicReference、AtomicReferenceFieldUpdater AtomicStampReference:CAS的ABA问题 由于CAS原语的直接操作与计算机底层的联系很大,CAS原语有三个参数, 内存地址 、 期望值 、 新值

redis命令之 ----String(字符串)

我是研究僧i 提交于 2021-01-13 15:27:15
SET SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值 value 关联到 key 。 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。 对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。 GET GET key 返回 key 所关联的字符串值。 如果 key 不存在那么返回特殊值 nil 。 假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。 APPEND 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。 SETBIT SETBIT key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。 当 key 不存在时,自动生成一个新的字符串值。 字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。 offset 参数必须大于或等于

Java编程思想

[亡魂溺海] 提交于 2021-01-13 15:23:32
前言 Q: 为什么学习并发? A: 到目前为止,你学到的都是有关顺序编程的知识,即程序中的所有事物在任意时刻都只能执行一个步骤。 A: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于某些问题,如果能够并行地执行程序的多个部分,则会变得非常方便而且很有必要。 A: 并发编程可以使程序执行速度得到极大的提高,或者为设计某些类型的程序提供更易用的模型,或者两者皆有。 A: 另一个问题你必须意识到,当并发执行的任务彼此开始相互干涉时,实际的并发问题就会接踵而来。实际上你可能无法编写出能够针对你的并发程序生成故障条件的测试代码。所产生的故障经常是偶尔发生,并且经常是以客户抱怨的形式出现,这就是为什么要学习并发的强烈理由:如果视而不见,你就会遭其反噬。 A: 有很多Java程序,要么只是偶尔工作,要么在大多数时间里工作,并且会由于未发现的并发缺陷而时不时地神秘崩溃,有时这种崩溃是温和的,但有时却意味着重要数据的丢失,并且如果没有意识到并发问题,你可能最终会认为问题出在其他什么地方,而不在你的软件中。基本上,了解并发可以使你意识到明显正确的程序可能会展示出不正确的行为。 并发的多面性 Q: 如何理解并发的多面性? A: 并发编程令人困惑的一个最主要原因是:使用并发时需要解决的问题有多个,而实现并发的方式也有多重,并且在这两者之间没有明显的映射关系

Simulink仿真入门到精通(四) Simulink子系统

江枫思渺然 提交于 2021-01-13 06:41:25
4.1 Simulink子系统详解 4.1.1 子系统概述 Simulink根据仿真特性将模块的属性分为两种:虚拟模块和非虚拟模块。 非虚拟模块在仿真过程中起到实际的作用,对其进行编辑或者增加删除操作会影响到模型运行和改变模型的结果。 虚拟模块在仿真过程中不起实际作用,主要是为了从图框上进行程序的层次性划分以保持模型的图形界面的整洁性。 4.1.2 Simulink模型的运行顺序 Simulink模型的计算顺序是基于时间采样和信号流向的,即按照时间的顺序执行。 每一个采样点时间,模型中所有模块的状态和输入/输出值都要计算并更新一下,每个模块的输出值都通过信号线连接并传递给下一个模块的输入。系统采样时间由解算器类型和步长共同决定,并且作为Simulink模型仿真的最小粒度。当系统采样时刻到来时,每个模块再根据自身所设定的采样时间方式决定是否在当前这个采样时刻进行计算。 允许用户设定采样时间的模块在其参数对话框中都提供Sample Time这个属性。对于模块的Sample Time,常用的值有: -1:继承输入信号采样时间,若没有输入信号,则继承父层模型采样时间,如果模块无输入并且本身处于顶层模型中,则继承系统解算器的步长。 0:连续采样时间。 非零正数:离散采样时间。 Inf:无穷大采样时间,即不采样。 [Sampletime,offset]:Sampletime为上述一种