问题标签 [data-race]

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 投票
1 回答
305 浏览

go - Redigo concurrent Set gives data race

I'm running this test against my redigo functions to see if it supports massive concurrent writes, here're the code

When running the test with go test -run TestManySets /path/to/package -count 1 -v I'm getting A LOT of EOF error;

and when running the test with -race, i.e. go test -race -run TestManySets /path/to/package -count 1 -v I'm getting a lot of data race detected, anyone could kindly point out to me how I could make things right?

Below is the data race log:

And redis_test.go line 47 is where the Set happens in the code above.

0 投票
3 回答
6839 浏览

c++ - 多线程程序卡在优化模式但在-O0下正常运行

我写了一个简单的多线程程序如下:

它在Visual Studiogc-O0 c中的调试模式下正常运行,并在几秒钟后打印出结果。但它卡住并且在发布模式下不打印任何内容或.1-O1 -O2 -O3

0 投票
0 回答
58 浏览

c++ - 如果使用普通列表作为 spsc 队列会发生什么情况?

我知道使用普通列表作为 spsc-queue 不是线程安全的。但我不知道为什么?如果我这样做会发生什么问题?我阅读了一篇关于 mpsc-queue 的论文,并对代码进行了一些更改。我将其更改为 spsc-queue。但我不知道我的 spsc_queue 是否是 thread_safe。

0 投票
2 回答
173 浏览

c++ - 重新排序内存操作的简单示例

我试图编写一些代码来观察内存操作的重新排序。

在下面的示例中,我预计在 set_values() 的某些执行中,分配值的顺序可能会发生变化。特别是 notification = 1 可能发生在其余操作之前,但即使在数千次迭代之后也不会发生。我用 -O3 优化编译了代码。这是我指的 youtube 材料:https ://youtu.be/qlkMbxUbKfw?t=200

现在程序陷入无限循环。我希望在某些迭代中 set_values() 函数中的指令顺序可以改变(由于现金内存的优化)。例如 notification = 1 将在 c = 3 之前执行什么将触发执行 calculate() 函数并给出 a==3 什么满足终止循环的条件并证明重新排序

或者也许有人可以提供其他简单的代码示例来帮助观察内存操作的重新排序?

0 投票
1 回答
218 浏览

c++ - cuda:多个线程访问同一个全局变量

在这段代码中,我知道 X、Y 可能存在数据竞争。我之前的想法是:允许读取的XI、XJ、YI、YJ可能不是最新的数据。但是,我发现在数据竞争的过程中,可能会导致 XI, XJ, YI, YJ读取随机内存值。也就是说,内存访问冲突。即使我在读写过程中加了一个锁,我仍然得到相同的结果。只有当我减小 dimB 和 dimG 的大小以使几乎没有数据竞争时,我才能得到正确的结果。有什么解决办法吗?

我在windows + vs2015 + cuda9.1环境下使用64位编译。

但是,我在linux下使用同样的代码,并没有发现任何问题。

windows下使用nsight cuda调试器是没有问题的。原因可能是使用调试器运行很慢并且不会导致数据竞争。

--------更新行-----删除其他代码

0 投票
1 回答
234 浏览

java - 如果两个不同步的线程将一个计数器增加 X 次,总的结果会小于 X 吗?

我在一个紧密循环中有两个不同步的线程,将全局变量递增 X 次(x=100000)。

全局的正确最终值应该是 2*X,但是由于它们是不同步的,所以它会更小,根据经验,它通常只是略高于 X

但是,在所有测试运行中, global 的值从未低于 X 。

最终结果是否可能小于 x (小于 100000 )?

0 投票
3 回答
152 浏览

java - 变量的不同步读/写可能导致数据竞争?

Jack ShiraziJava Performance Tuning中写道:

这意味着变量的访问和更新是自动同步的(只要它们不是长整数或双精度数)。如果一个方法只包含一个变量访问或赋值,就没有必要为了线程安全而使其同步,并且出于性能考虑不这样做的所有理由。线程安全进一步扩展到独立于任何其他变量值访问或分配给变量的任何语句集。

根据上面的描述,操作 likeflag = true总是原子的,不需要synchronize.

但是,这里有另一篇文章将以下情况视为数据竞争

作者说:

现在,所有执行都有数据竞争,因为标志不是易失的

这两篇文章之间的冲突让我很困惑。

0 投票
1 回答
35 浏览

go - 想要数据竞赛还是糟糕的设计?

我正在实现一个应用程序,该应用程序集成了每秒点击次数限制的第三方 API。我编写了我的适配器并且我是一个快乐的人,直到我使用竞争条件检测器运行我的测试。

设计很简单,有一个:

  • 计算它发出的请求的结构
  • 每秒将此计数器重置为 0 的滴答声
  • 此结构上的私有函数在满足条件之前一直阻塞,以允许对 API 进行额外调用。

运行这个测试用例效果很好,直到你给它-race标志。我相信数据竞争是由试图重置命中计数器的滴答线程和增加它的调用请求引起的......

我的设计是坏的还是我应该忍受数据竞争警报?

0 投票
2 回答
1828 浏览

c++ - 多个线程可以安全地同时将相同的值写入同一个变量吗?

多个线程可以安全地同时将相同的值写入同一个变量吗?

举一个具体的例子——C++ 标准是否保证以下代码在每个符合标准的系统上都可以编译、运行而没有未定义的行为并打印“true”?

这是一个理论问题;我想知道它是否总是有效,而不是在实践中是否有效(或者像这样编写代码是否是一个好主意:))。如果有人能指出标准的相关部分,我将不胜感激。以我的经验,它在实践中总是有效的,但不知道它是否能保证我总是使用它std::atomic——我想知道这对于这种特定情况是否是绝对必要的。

0 投票
0 回答
62 浏览

multithreading - 来自低级 tcl 库函数 Tcl_NewStringObj 的数据竞争问题

由于 Tcl 使用单元线程模型作为其基本的多线程框架,每个 tcl 解释器 obj 都绑定到创建它的线程。在我的程序中,每个线程在第一次需要调用任何 tcl 命令时调用 Tcl_CreateInterp 来创建自己的解释器。但是问答测试报告说,当线程打算创建自己的解释器时,valgrind (v3.13.0) 抱怨可能存在数据竞争问题。数据竞争发生在 apis Tcl_NewStringObj/TEBCresume/TclNREvalObjv 等。我的使用模型有什么要纠正的吗?还是valgrind的误报?

我使用 boost::thread_specific_ptr 来管理线程本地解释器。