问题标签 [thread-sanitizer]
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.
catch2 - 在 ThreadSanitizer 中禁用线程泄漏测试?
我将 ThreadSanitizer 与 Catch2 一起使用。不幸的是,ThreadSanitizer 在我的代码中发现了带有 Catch2 和线程竞争条件的线程泄漏。有什么方法可以禁用 ThreadSanitizer 的线程泄漏检测但继续进行竞争条件测试?
c++ - 为什么线程清理程序抱怨获取/释放线程围栏?
我正在学习不同的记忆顺序。
我有这段代码,它可以工作并通过 GCC 和 Clang 的线程消毒剂:
我认为如果它最终没有返回from
,那么“获取”加载是不必要的,所以我决定使用“放松”加载,然后是“获取”围栏。
我希望它能够工作,但它被 thread sanitizers 拒绝,它声称 concurrentstate++
是数据竞争。
为什么这是一场数据竞赛?
原子栅同步
线程 A 中的原子释放操作 X 与线程 B 中的获取栅栏 F 同步,如果
- 存在原子读取 Y(具有任何内存顺序)
- Y 读取 X 写入的值(或以 X 为首的释放序列)
- Y 在线程 B 中排在 F 之前
在这种情况下,在线程 A 中的 X 之前排序的所有非原子和松弛原子存储将发生在 F 之后线程 B 中相同位置的所有非原子和松弛原子加载之前。
据我了解,所有条件都满足:
- “存在原子读取 Y(具有任何内存顺序)” - 检查:
a.load(std::memory_order_relaxed)
。 - “Y 读取 X 写入的值”——检查,它从 读取值
a.store(to, std::memory_order_release);
。 - “Y 在线程 B 中排在 F 之前”——检查。
c++ - 如何为线程清理程序注释 seq-cst 原子栅栏?
我了解到TSAN 不理解std::atomic_thread_fence
,要修复它,您需要告诉 TSAN 哪些原子变量受围栏影响,通过放置__tsan_acquire(void *)
和__tsan_release(void *)
旁边(分别用于获取和释放围栏)。
但是 seq-cst 栅栏呢?据我了解,它们比 acq-rel 围栏更严格,所以 acq-rel 注释可能还不够?
我对不同的内存顺序不太熟悉,所以我可能会遗漏一些东西。
c++ - 代码如何知道它是使用 AddressSanitizer 或 ThreadSanitizer 编译或运行的?
如果我的 C++ 程序是用 AddressSanitizer 或 ThreadSanitizer 编译的,我希望它能够打印。AddressSanitizer中提出的解决方案:我们怎么知道 C 中的目标文件/可执行文件是用 AddressSanitizer 编译的?将不起作用,因为我不希望程序必须打开自己的目标代码并以这种方式探索自己。有#define
它可以检查的吗?我可以添加自己的,但如果已经存在,我不想添加。
c++ - 我可以在 Windows 10 上使用 Thread Sanitizer 吗?
我想在 Windows 10(64 位)上用 C++ 测试数据竞争,但Visual C++ 似乎还不支持它。因此,我安装了 Cygwin 并获得了 g++ 11.2.0,尝试使用 编译我的 C++ 代码-fsanitize=thread -fPIE -pie -g
,但失败并-ltsan not found
出现错误。
该文档没有提及有关 Windows 的任何内容。甚至可以在 Windows 上使用 Thread Sanitizer 吗?如果是这样,如何?
c++ - TSan 种族随着 alignas 消失 (32)
我有一个无锁队列的实现,我认为它是正确的(或者至少是无数据竞争的):
这个队列被实现为一个单链双端链表。它使用虚拟节点来解耦生产者和消费者,并使用生成计数器和节点回收(使用内部堆栈)来避免 ABA 问题和try_dequeue
.
在使用 Clang 13.0.1、Linux x64 编译的 TSan 下运行它,我得到了以下比赛:
在 Godbolt 上运行(注意,由于 Godbolt 运行程序的方式,TSan 不显示行号信息)
这场比赛是在从线程try_dequeue
调用的先前读入之间进行的:consumer
这稍后会写入,这是线程enqueue
的第三次调用:enqueue
producer
我相信这场比赛是不可能的,因为线程应该通过获取-释放比较交换producer
与线程同步到in和.consumer
stack_top
allocate_node
deallocate_node
现在,奇怪的是,制造GenNodePointer
alignas(32)
消除了比赛。
问题:
- 这场比赛真的可能吗?
- 为什么增加 GenNodePointer 的对齐会使 TSan 不再注册比赛?