问题标签 [atomic]

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.

0 投票
8 回答
7541 浏览

c++ - 这个用于原子浮点的 C++ 实现安全吗?

编辑:这里的代码仍然有一些错误,它可以在性能部门做得更好,但是我没有尝试修复这个问题,而是将问题提交给英特尔讨论组并得到了很多很好的反馈,如果一切顺利,Atomic float 的抛光版本将包含在英特尔线程构建模块的近期版本中

好的,这是一个艰难的,我想要一个原子浮点数,不是为了超快的图形性能,而是作为类的数据成员常规使用。而且我不想为在这些类上使用锁付出代价,因为它没有为我的需求提供额外的好处。

现在有了英特尔的 tbb 和我见过的其他原子库,支持整数类型,但不支持浮点。所以我继续实施了一个,它有效......但我不确定它是否真的有效,或者我很幸运它有效。

这里的任何人都知道这是否不是某种形式的线程异端?

谢谢!

编辑:按照 Greg Rogers 的建议将 size_t 更改为 uint32_t,这样它更便携

编辑:为整个事物添加了列表,并进行了一些修复。

更多编辑:在我的机器上使用锁定浮点数进行 5.000.000 += 操作(在我的机器上使用 100 个线程)需要 3.6 秒,而我的原子浮点数即使是愚蠢的 do-while 也需要 0.2 秒才能完成相同的工作。因此,> 30 倍的性能提升意味着它是值得的,(这就是问题所在)如果它是正确的。

更多编辑:正如 Awgn 指出的那样,我的fetch_and_xxxx部分都错了。修复了这个问题并删除了我不确定的部分 API(模板化内存模型)。并在运算符 += 方面实现了其他操作,以避免代码重复

添加:添加了运算符 *= 和运算符 /=,因为没有它们,浮点数就不会是浮点数。感谢 Peterchen 的评论,这被注意到了

编辑:最新版本的代码如下(我将保留旧版本以供参考)

0 投票
3 回答
3120 浏览

multithreading - SetEvent 是原子的吗?

有 2 个或更多线程在不受关键部分保护的同一事件处理程序上调用 Win32 API 的 SetEvent 是否安全?

0 投票
4 回答
1288 浏览

winapi - Win32:代码块的原子执行

我有两个系统调用 GetSystemTime() 和 GetThreadTimes() 我需要计算给定 Win32 线程的 CPU 利用率。

为了准确起见,我需要确保 GetSystemTime() 和 GetThreadTimes() 都是原子执行的;即在调用GetSystemTime() 和GetThreadTimes() 之间不应有上下文切换。

原因是偶尔我会得到超过 100% 的百分比(约 500 分之一)。

如何确保 2 个函数调用的原子执行?

谢谢,萨钦

0 投票
16 回答
15762 浏览

linux - 以原子方式移动目录

我在同一个父目录中有两个目录。调用父目录base和子目录alphabravo。我想用bravo替换alpha。最简单的方法是:

mv 命令是原子的,但 rm -rf 不是。bash 中是否有一种简单的方法可以用bravo原子地替换alpha?如果没有,有没有复杂的方法?

附录:

顺便说一句,如果目录在短时间内不存在,这不是一个无法克服的问题。只有一个地方会尝试访问 alpha,它会在执行任何关键操作之前检查 alpha 是否存在。如果不是,它会给出错误消息。但如果有办法做到这一点,那就太好了。:) 也许有一些方法可以直接修改 inode,或者什么......

0 投票
10 回答
48644 浏览

django - Django:如何防止同时修改数据库条目

是否有办法防止两个或多个用户同时修改同一数据库条目?

向执行第二次提交/保存操作的用户显示错误消息是可以接受的,但数据不应被静默覆盖。

我认为锁定条目不是一种选择,因为用户可能会使用“返回”按钮或简单地关闭他的浏览器,从而永远保持锁定状态。

0 投票
3 回答
1202 浏览

mysql - 我可以原子地重命名/替换 2 个或更多表和视图吗?

给定一个表 X 和一个视图 Y(与 X 具有相同的结构),有没有办法将 X 重命名为 Z 并将 Y 重命名为 X,这样任何查询都不会看到任何名为 X 的东西?重命名 X 并创建视图也是有效的。

关键是,作为模式迁移计划的一部分,将旧表替换为从新版本模拟旧版本的视图,以便两组客户端代码可以同时运行。

MySQL 是我的选择,但其他人的信息也会很有用。

0 投票
4 回答
1400 浏览

queue - 是否可以仅使用 POSIX 信号量来避免唤醒等待竞赛?是良性的吗?

我想使用 POSIX 信号量来管理从代表队列的文件中获取和放置的原子。我想要在文件系统中命名某些东西的灵活性,以便完全不相关的进程可以共享一个队列。我认为这个计划排除了 pthreads。命名的 posix 信号量非常适合在文件系统中放置任何进程都可以看到的东西,但我找不到标准的 CondWait 原语:

当进程调用 CondWait 时,它会自动发布到 sem 并等待 cond。当其他一些进程发布到 cond 时,等待进程只有在它也可以自动递减 sem 时才会唤醒。的替代品

受到竞争条件的影响,其中一些其他进程在该进程等待它之前发出 cond 信号。

我几乎没有做过任何并发编程,所以我想我会问这样:如果我对条件变量使用标准的 POSIX 计数信号量,这场比赛有可能是良性的吗?

以防万一有人想要更大的上下文,我正在为可以从 shell 脚本调用的原子队列构建 get 和 put 操作。

0 投票
4 回答
347 浏览

.net-2.0 - 如何确保获取和设置操作的原子性以重定向 Console.Out 以记录控制台输出?

我需要拦截控制台输出流以便将其捕获为日志,但仍将内容传递给原始流,以便应用程序正常工作。这显然意味着在将原始Console.OutTextWriter 更改为Console.SetOut(new MyTextWriterClass(originalOut)).

我假设获取 Out 属性和调用 SetOut() 方法的各个操作Console是以线程安全的方式实现的。但我想确保其他一些线程(例如,运行我无法控制且无法更改的客户端应用程序代码,因此我不能依赖我自己的自定义锁定方案)不能在我的 get 和 set 之间意外更改它,最终被我对它的更改覆盖(破坏了他们的应用程序的行为!)。由于其他代码可能只是调用 SetOut(),因此我的代码理想情况下应该获得内部使用的相同锁Console(假设有一个)。

不幸的是,Console是一个(静态)类,而不是一个实例,所以你不能只是lock (Console). 在类文档中查看似乎没有提到锁定。这不是这些 Console 方法的通常预期用法,但应该有一些安全的方法来作为原子操作执行此操作。

如果标准锁定方案失败,是否有其他方法可以确保这一点?对于如此短的关键部分(并且只完成一次),即使是暂时阻塞所有其他线程也是可以接受的,如果这是唯一的方法的话。我们正在使用 C# 和 .NET2.0。

如果这甚至不可能(不中断客户端应用程序),那么我们将不得不依赖它,客户端应用程序不太可能重定向其控制台输出碰巧在我们的 get 和 set 操作之间进行。我只想覆盖所有的基础,以防万一。

编辑:现在我们有了示例代码的具体答案,我已经改写了问题标题,以更普遍地反映答案可以提供帮助的用例,更清楚。此外,还为“原子”添加了一个标签。

0 投票
3 回答
1450 浏览

perl - 在 Perl 中进行跨平台、原子文件替换的最佳方法是什么?

我有一个很常见的情况。我有一个文件,我需要用新内容完全覆盖该文件。但是,每次页面加载时都会访问原始文件(这是一个 Web 应用程序),因此它不会丢失很长时间。几毫秒是可以的(虽然不理想),一秒钟是不行的。

现在我通过将临时文件写入同一目录然后将该临时文件重命名为新文件的名称来做到这一点。我只是在 Perl 中使用普通的 File::Temp 和“重命名”来执行此操作。我想知道——还有其他推荐/更好的方法吗?最好是不需要 CPAN 模块的模块,因为这是我系统中唯一需要执行此操作的地方,而且我不想要一个全新的依赖项。

哦,所有这些都必须在 Windows、Linux、BSD、OS X、Solaris 和大多数其他常见平台上运行。

这是有问题的代码,对于那些感兴趣的人。

0 投票
5 回答
2724 浏览

django - 如何在 Django 中进行文本完整历史记录?

我想拥有用户编辑的大型文本字段的完整历史记录,使用 Django 存储。

我看过的项目:

我有一个特殊的用例,它可能超出了这些项目提供的范围。此外,我对这些项目的文档记录、测试和更新情况持谨慎态度。无论如何,这是我面临的问题:

我有一个模型,就像这样:

这个文本字段可能很大 - 超过 40k - 我想要一个自动保存功能,每 30 秒左右保存一次字段。很明显,如果有很多每个 40k 的保存(如果压缩,可能仍然是 10k),这可能会使数据库变得非常大。我能想到的最佳解决方案是在最近保存的版本和新版本之间保持差异。

但是,我担心涉及并行更新的竞争条件。我想到了两种不同的比赛条件(第二个比第一个严重得多):

  1. HTTP 事务竞争条件:用户 A 和用户 B 请求文档 X0,并分别进行更改,产生 Xa 和 Xb。Xa 被保存,X0 和 Xa 之间的区别是“Xa-0”(“a less not”),Xa 现在作为正式版本存储在数据库中。如果 Xb 随后保存,它将覆盖 Xa,差异为 Xb-a(“b 减去 a”)。

    虽然不理想,但我并不过分担心这种行为。文档相互覆盖,用户 A 和 B 可能不知道彼此(每个都从文档 X0 开始),但历史记录保持完整性。

  2. 数据库读取/更新竞争条件:有问题的竞争条件是 Xa 和 Xb 同时保存超过 X0。将有(伪)代码,例如:

    如果 Xa 和 Xb 都从数据库中读取 X0(即 orig_doc 是 X0),它们的差异将变为 Xa-0 和 Xb-0(相对于序列化的 Xa-0 然后 Xb-a,或者等效地 Xb-0 然后 Xa-乙)。当您尝试将差异修补在一起以生成历史记录时,它会在补丁 Xa-0 或 Xb-0(两者都适用于 X0)上失败。历史的完整性已经受到损害(或者已经受到损害?)。

    一种可能的解决方案是自动协调算法,它可以事后检测这些问题。如果重建历史失败,人们可能会假设发生了竞争条件,因此将失败的补丁应用于历史的先前版本,直到它成功。

我很高兴收到一些关于如何解决这个问题的反馈和建议。

顺便说一句,就它是一种有用的出路而言,我注意到这里讨论了 Django 原子性:

非常感谢你。