问题标签 [test-and-set]

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 投票
0 回答
49 浏览

multithreading - 为什么 TSL 不能为多线程提供安全的原子操作

为什么使用 TSL 的原子操作系统的系统调用并没有为我们提供两个以上同时线程\进程的线程安全解决方案?

编辑:我很抱歉这个错误,我的意思是 TSL 而不是测试和设置。参考维基文章 - http://en.wikipedia.org/wiki/Test-and-set 具体来说:

test-and-set 操作可以解决不超过两个并发进程的无等待共识问题。

0 投票
3 回答
348 浏览

c# - .Net CompareExchange 重新排序

编译器或处理器是否可以重新排序以下指令,以便另一个线程看到a == 0b == 1

假设int a = 0, b = 0;某处。

0 投票
2 回答
251 浏览

c++ - 在 C++ 中使用原子 TestAndSet 混合无锁和全锁线程同步

我有一个消费者线程,必须从缓冲区中读取而无需锁定。如果由于生产者线程正在写入缓冲区而必须跳过该操作,那很好。因此,在我看来,最合适的选择是某个标志上的原子 TestAndSet

现在,前面提到的生产者线程也必须尊重这个标志,因为当消费者正在读取缓冲区时,它们不能开始写入缓冲区。我可以使用 atomic_flag::test_and_set 来解决这个问题,如下代码:

...但是编写我自己的自旋锁似乎不太理想。我宁愿让我的线程休眠,直到它由于标志被清除而被唤醒。就像是:

TLDR:如何最好地同步两个线程,一个可以锁定,另一个不能?

0 投票
1 回答
75 浏览

c - 与测试和设置指令/操作相比,++/-- 运算符的历史

我正在学习 CS420 - 操作系统。前几天我的教授在课堂上提到了一些让我感兴趣的东西,我一直在研究它并且已经接近但找不到答案。

他提到他和另一位教授过去曾想知道创建 ++/-- 运算符是否最初是为了将 ++/-- 运算符绑定到测试和设置操作/指令。

他说他们无法弄清楚。我没有问他他们为此投入了多少精力,但对社区的投入非常感兴趣。

0 投票
0 回答
42 浏览

multithreading - 如何分析具有两个原子测试和设置调用的互斥算法

有人在此站点上发布了两个线程的简单互斥算法。

对于 Thread0get_id()返回false,对于 Thread1 它返回true。这tset()是一个原子测试和设置函数,它将其参数的值设置为true并返回前一个值。

在被作者删帖之前,对于这个算法是否没有竞态条件或者死锁的问题,不同的用户给出了不同的答案。

如何分析这个算法?

0 投票
1 回答
308 浏览

c - CMPXCHG 和临界区实现

CMPXCHG 语句的工作方式如下:

如果 CMPXCHG 原子指令可用,那么实现临界区的最简单算法是什么?

0 投票
3 回答
1135 浏览

php - 用于读取-修改-写入的 PHP 群()不起作用

我有一个由 PHP 脚本维护的日志文件。PHP 脚本需要进行并行处理。我无法获得flock()处理日志文件的机制:在我的情况下,flock()不会阻止并行运行的 PHP 脚本共享的日志文件同时被访问并且有时被覆盖。

我希望能够读取文件,进行一些处理,修改数据并写回,而无需在服务器上并行运行相同的代码同时执行相同的操作。读修改写必须按顺序进行。

在我的一个共享主机(OVH France)上,它没有按预期工作。在这种情况下,我们看到计数器$c在不同的 s 中具有相同的值,iframe如果锁按预期工作,这应该是不可能的,它在其他共享主机上会这样做。

有什么建议可以使这项工作或替代方法吗?

谷歌搜索"read modify write" phpfetch and add没有test and set提供有用的信息:所有解决方案都基于一个有效的flock()。

这是一些独立运行的演示代码来说明。它从浏览器向服务器生成多个并行请求并显示结果。很容易直观地观察到故障:如果您的网络服务器不像我的一个那样支持flock(),则计数器值和日志行数在某些帧中将是相同的。

PHP 中有一个关于flock()限制的警告:flock - Manual,但它是关于 ISAPI (Windows) 和 FAT (Windows)。我的服务器配置是:
PHP 版本 7.2.5
系统:Linux cluster026.gra.hosting.ovh.net
服务器 API:CGI/FastCGI

0 投票
2 回答
711 浏览

c - 使用测试和设置实现锁

下面是OSTEP 书中关于使用测试和设置指令实现锁的代码。我的问题是,在这样的实现中,没有持有锁的线程不能调用解锁函数并拿走锁吗?

0 投票
0 回答
712 浏览

c++ - 互斥体实现,不支持测试和设置和 CAS 操作的硬件

让我们有以下简单的互斥锁定义:

以及以下acquire()func 实现(使用比较和交换操作):

在这种情况下,我们得到以下汇编代码:

或者在使用的情况下__atomic_test_and_set

我们得到以下汇编代码:

但是,如果我们没有对原子测试和设置和 CAS 操作(xchg以及lock cmpxchgx86 和其他架构上的等效操作)的硬件支持怎么办?在这种情况下编译器将使用什么解决方案?

PS - 我使用 gcc 8.2 生成汇编代码,这里是__atomic_内置函数:https ://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

0 投票
1 回答
92 浏览

concurrency - 需要帮助了解使用 test_and_set 实现互斥锁

Silberschatz、Galvin 和 Gagne 所著的《操作系统原理》一书对 test_and_set 的原子操作有以下实现

他们声明了一个初始化为 0 的全局变量锁,并为每个进程使用了​​以下互斥锁实现

现在,让我们考虑一下进程 P0 正在执行临界区而进程 P1 卡在 while 循环中的情况。然后考虑以下执行顺序

因此,进程 P0 或任何其他进程实际上不能永远进入临界区。那么这将如何处理这种情况呢?