问题标签 [atomic-values]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - AtomicIntegerArray 与 AtomicInteger[]
AtomicIntegerArray
和的含义有什么不同AtomicInteger[]
吗?哪一个使用起来更快?(我唯一注意到的是,首先占用的空间要少得多,但这意味着每次重新检查都在检查数组的边界,这样会使其变慢吗?)
编辑:在数组预先初始化的情况下。
php - 如何构建表格以使该字段保持原子性?
我有一个购物车,我必须在其中跟踪库存,这包括带有属性的库存。例如:
这些字段目前在数据库中用逗号分隔,ID 如下:
其中每个数字代表一个特定属性(1=蓝色,3=小)。问题是这变得非常难以处理,因为数据在数据库中不是原子的,但我不知道如何构造表,因为可能有无限多的项目组合,例如:
任何人都可以建议一种更好的方式将这些信息存储在数据库中吗?我想过使用查找表,但由于属性数量不同,这不起作用。
performance - 循环的并行版本不比串行版本快
我正在用 C++ 编写一个程序来执行特定系统的模拟。对于每个时间步,执行的最大部分是由单个循环占用。幸运的是这是令人尴尬的并行,所以我决定使用 Boost Threads 来并行化它(我在 2 核机器上运行)。由于没有锁定,我希望加速接近串行版本的 2 倍。但是我发现根本没有加速。
我实现了循环的并行版本,如下所示:
- 唤醒两个线程(它们被阻塞在屏障上)。
然后每个线程执行以下操作:
- 原子地获取并增加一个全局计数器。
- 检索具有该索引的粒子。
- 对该粒子执行计算,将结果存储在单独的数组中
- 等待工作完成障碍
主线程等待作业完成屏障。
我使用这种方法是因为它应该提供良好的负载平衡(因为每次计算可能需要不同的时间)。我真的很好奇是什么可能导致这种放缓。我总是读到原子变量很快,但现在我开始怀疑它们是否有性能成本。
如果有人有一些想法要寻找什么或任何提示,我将不胜感激。我一直在抨击它一个星期,并且分析并没有透露太多。
编辑:问题解决了! 我将详细说明我是如何解决这个问题的。我再次使用 gprof,但这次编译时没有优化标志 (-O3)。立即,分析器表明我在对每个粒子执行计算的函数上花费了令人难以置信的时间:比在串行版本中要多得多。
这个函数是虚拟的,可以多态访问。我更改了代码以直接访问它,而不是通过 vtable 和瞧,并行版本产生了近 2 的加速!串行版本的相同更改几乎没有效果。
我不确定为什么会这样,如果有人知道,我会很感兴趣!
感谢所有的海报。你们都在一定程度上有所帮助,很难接受一个答案。
java - AtomicInteger 未从主存储器读取非易失性可变引用的值
下面是流行的丈夫妻子银行账户问题的非线程安全实现。
(一个线程先检查账户,在同一个线程进行提现之前,另一个线程进行提现操作,从而破坏了代码)。
如果我们在执行 Demo.java 文件后查看程序的日志。很明显,“妻子线程”不是从主内存中读取 AtomicInteger 数量的值。
另外,我用普通的“volatile int”尝试了同样的例子。但同样,我面临同样的问题:-“妻子线程没有从主存储器中读取数量整数的值。”
请解释这种行为以帮助我理解这个概念。请在下面找到代码:-
AtomicBankAccount.java
AtomicWithdrawThread.java
演示.java
最好的祝福,
仪式
string - 如何使用原子向量作为R中图形标题的字符串
我正在尝试从 R 中的 z 分数矩阵绘制图表,我想构建一个函数来使用列标题作为标题的一部分遍历每一列并将每个图表保存为 png。我想我知道如何进行迭代并将图形保存为 png,但我一直坚持使用向量作为字符串。我尝试上传没有列标题的矩阵,然后将 matrix[1,] 存储为要使用的变量“标题”。然后我尝试绘制:
我得到:
我尝试不使用“+”,它说:
所以然后我环顾四周,找到了 'paste(headers[i],collapse="") ,虽然我可以替换它,但它只是将数字 '28' 作为标题。
我已经尝试了我认为是另一个潜在的解决方案:
我得到:
我是 R 新手,如果我在谷歌搜索数小时后碰巧偶然发现了正确的指南/教程,这似乎会变得如此简单,但我真的没有那种时间在我手上。任何建议,指针或解决方案都会很棒?
java - 使用 AtomicIntegerArray 在 Java 中实现 AtomicByteArray
我需要一个 AtomicByteArray 用于以 Java 的AtomicIntegerArray为模型的内存关键型应用程序。我的实现将四个字节包装成一个整数并使用 AtomicIntegerArray。
实现很简单,get()
andset()
实现相当简单。比较compareAndSwap()
棘手。我的实现如下所示(它在单线程中工作得很好)。
我正在尝试确定比赛条件。get()
一种可能的情况是,值在对and的调用之间发生了变化和交换compareAndSet()
,但这似乎是无害的。
我错过了任何可能出错的事情吗?
更新:我已经实现了AtomicByteArray的基本版本,它集成了以下答案中的改进。
list - SCHEME 从列表中删除原子值
我需要执行一个发送值的函数,并在列表中检查是否有相等的值以将其删除。这里有些例子:
我试过这个:
我的结果是这样的:
由于某种原因,列表中的最后一个值没有显示。希望有人可以提供帮助。
谢谢!
java - 使用 AtomicBoolean 控制实例的状态
我需要确保每个实例生命周期只执行一次特定的启动和停止代码,并且不能“重新启动”实例。对于多个线程可能作用于实例的场景,以下代码是否足够?
r - 尽管没有使用原子向量或 $,但错误“$ 运算符对原子向量无效”
你好堆垛机!这是我的第一个问题,所以我很好奇您是否可以帮助我!:)
首先:我检查了类似的问题,不幸的是没有一个解决方案对我有用。现在尝试了将近 3 天:/ 由于我正在处理敏感数据,因此很遗憾,我无法为 reprex 提供原始表。但是,我将创建一个小的替代示例表进行测试。
要解决问题:
我想使用包“CNorm”来预测规范值。它需要原始数据、分类数据、模型和最小值/最大值以及其他一些不太重要的东西。问题是:无论我做什么,无论我使用什么数据类型和工作目录,它都会给我一个错误“$ 运算符对原子向量无效”,以改变我将原始 .sav 文件转换为数据帧。好吧——什么也没发生。我测试了数据的类型,它说的是数据帧,而不是原子向量。我也尝试使用“[1]”作为位置或使用[“Correct”]作为名称,但仍然出现相同的错误。使用 2 个单个数据框,使用列表也是如此。我尝试使用 $ 来检查,如果我得到不同的错误,但也相同。我什至使用另一个工作区来检查旧工作区是否被窃听。
所以也许我只是犯了非常愚蠢的错误,但我真的尝试过但没有成功,所以我问你,解决方案可能是什么。这里有一些数据可以测试!:)
这就是我在数据框“Data_4”上使用的命令之一。我也尝试不使用方括号或使用“xxx”来获取列名,但无济于事。
以下是示例数据框。 为了更真实地测试它,我建议使用 2 列和 900 行(+ 列标题)的 Exel 文件(如原始文件)。“正确”值可以由 Excel 随机选择,它们从 35 到 50 不等,年龄从 6 到 12 不等。
正确的 | 年龄 |
---|---|
40 | 6 |
45 | 7 |
50 | 6 |
35 | 6 |
我真的希望你们中的某个人能够找出问题以及如何让命令正常运行。我现在真的没有其他想法。
感谢您检查我的问题,并提前感谢您的时间!我很高兴收到您的来信!
c - 单读单写固定大小的环形缓冲区,没有锁和原子变量,对于任何 CPU 拱门总是安全的吗?
在今天的一次采访中,被要求将阻塞调用封装到非阻塞。所以我们(面试官和我)决定通过在非阻塞 API 中添加一个后台线程来实现这一点。这是我写的代码:
让我在这里稍微解释一下:
read_next_sample()
是否提供了阻塞调用;- 第 44 行
get_most_recent_lux()
是我需要提供的封装非阻塞 API。 - 在内部,它启动一个线程来执行第
worker_thread()
36 行中定义的函数。 worker_thread()
不断调用阻塞调用并将数据写入 ringbuf。- 因此读者可以从 ringbuf 中读取最新的记录数据。
另请注意:
- 这里使用的这种编程语言是 C,而不是 C++。
- 这是一个单读单写的案例。
- 这与生产者-消费者问题不同,因为包装后的 API
get_most_recent_lux()
应始终返回最新数据。
由于这是一个单一的读者单一作家案例,我相信:
- 这里不需要锁。
- 这里不需要原子值。(所以第 33 行中的 head 没有被声明为原子值,我
head = idx
在第 40 行使用了正常的评估操作 ( ))。
问:我上面的说法对吗?
面试官一直告诉我,我的陈述并不适用于所有 CPU 架构,所以他认为这里需要互斥锁或原子变量。但我不这么认为。我相信,确实,单行评估 C 代码 ( head = idx
) 可以翻译成多条汇编指令,但只有最后一条汇编指令用于将更新后的值存储到内存中。所以,
- 在最后一条汇编指令执行之前,更新的值还没有更新到内存中,所以阅读器总是会读取旧的头值。
- 在执行最后一条汇编指令后,阅读器将始终读取更新后的头部值。
- 在这两种情况下,它都是安全的,不会发生腐败。
- 没有其他可能性。在只能发生 1 次写入的指定时间段内(假设从 1 变为 2),读取器只能读取 1 或 2,读取器永远不会读取除 1 或 2 之外的任何值,例如 0、3 或1.5。
同意?我真的不敢相信有任何 CPU 拱门代码不起作用。有的话请不吝赐教。非常感谢。