问题标签 [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 投票
3 回答
75 浏览

c++ - 一个线程写入和另一个读取非原子保证写入

说我有

保证作者写完后就unsafeBool变成了。true我知道阅读器输出的是未定义的行为,但据我所知,写入应该没问题。

0 投票
0 回答
65 浏览

c++ - 一致性影响并发算法?

是否存在const影响任何 C++ 标准库算法或容器的并发性的不存在或存在的示例?如果没有,是否有任何理由const不允许以这种方式使用 -ness?

为了澄清,我假设const对对象的并发访问是无数据竞争的,正如在包括GotW 6在内的几个地方所提倡的那样。

以此类推,noexcept移动操作的 -ness 会影响std::vectors 方法的性能,例如resize.

我浏览了几个 C++17 并发算法,希望能找到一个例子,但我什么也没找到。像这样的算法不需要or函数对象是. 我确实发现为原始的非执行策略版本采用了一个函数对象,并为C++17 执行策略版本采用了一个函数对象;我认为这可能是一个例子,程序员被迫根据函数对象是否可以安全复制(操作)来手动选择一个或另一个......但目前我怀疑这个要求只是为了支持返回类型(vs. )。transform unary_opbinary_opconstfor_eachMoveConstructibleCopyConstructibleconstUnaryFunctionvoid

0 投票
2 回答
76 浏览

javascript - 如何让 JavsScript 回调等待另一个回调?

我需要同时进行两个 API 调用。并且其中一个回调必须在另一个之前执行。但是按顺序进行调用会很慢并且对用户体验不利:

使用std::conditional_variable和以下伪(C++17 ish)代码在 C++ 中可以轻松地进行并行调用并等待另一个调用

我在各种网站上搜索过。但我不认为 JavaScript 附带任何类似的东西std::conditional_variable,甚至没有std::mutex. 我怎么能发出并行请求但让回调等待另一个?

0 投票
1 回答
44 浏览

triggers - 带有 InnoDB 的 MariaDB 中的触发器会发生“数据竞争”吗?

我的应用程序处理大量实时数据(每天超过 2 亿),我需要实时汇总它们以保持报告性能。数据由服务器的多个线程提供并因此随机处理。

MariaDB 10.5.6-MariaDBInnoDB 10.5.6

  • 您知道触发器是否是线程安全的,即是否可能发生数据竞争。换句话说,当 1000 次更新 - 仅增量 - 在一秒钟内通过 10 个连接发生在单行中的相同列上时,数据不会被弄乱,结果将就像值是由单个串联连接相加的.

  • 您是否知道行级锁定的工作原理以及它是自动的还是可以手动强制执行的。

分享您的一些相关书签也将不胜感激,因为我在 google 中没有找到任何简洁有用的东西。

更新

我添加了一个插入后触发器,如果​​记录不存在,它会在报告表中创建一条新记录,然后使用更新语句更新列update table set field=value+delta where condition。数据库不喜欢它,并且正在发送数据的应用程序 - java,hibernate - 也无法承受它并开始抛出异常:

  • 这与休眠尝试插入的行完全无关,因为它没有尝试更新。显然它来自 MariaDB 触发器:Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
  • 我不确定为什么会发生这种情况,但也得到了一些:Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
0 投票
1 回答
69 浏览

go - 从文件中读取数据并同时发送数据时出现数据竞争问题

我正在尝试从文件中读取数据并立即将读取的块发送给它,而无需等待其他 goroutine 完成文件读取。我有两个功能

第一个负责读取文件并将数据块发送到从另一个函数接收的“流”通道

第二个函数创建 2 个频道,将它们发送到第一个函数并开始收听频道。问题是有时data := <-stream会丢失。例如,我没有收到文件的第一部分,但收到了所有其他部分。当我使用 -race 标志运行程序时,它表明存在数据竞争,并且两个 goroutine 同时写入和读取通道。说实话,我认为这是使用渠道的正常方式,但现在我发现它带来了更多问题。有人可以帮我解决这个问题吗?

0 投票
2 回答
113 浏览

go - 指针接收器和非指针接收器的数据竞争差异

-race我在使用flag进行测试时发现了数据竞争。更新结构并从结构方法读取值时发生数据竞争。后来我发现将方法从非指针接收器更改为指针接收器可以解决数据竞争。但我不明白原因。谁能解释原因?

使用指针接收器方法,您没有错误

使用非指针接收器方法时出现此错误

0 投票
3 回答
108 浏览

java - 在多线程程序中更新共享资源

有人可以解释以下程序的输出:

输出:

  • [8, 5]
  • [9、2、2、8]
  • [2]

我无法理解输出中不同数量的值。我希望主线程要么等待所有线程完成执行,因为我将它们加入到 try-catch 块中,然后输出四个值,每个线程一个,或者在中断的情况下打印到控制台。这两者都没有真正发生在这里。

如果这是由于多线程中的数据竞争,它如何在这里发挥作用?

0 投票
0 回答
93 浏览

c++ - 什么时候应该使用`std::atomic`?

我正在做一个涉及使用多个线程的小项目。

C++ STD 库提供了不同的方法来防止undefined behaviordata races访问相同的内存块:

  • std::atomic
  • std::mutexstd::lock_guard

现在,据我了解,您可以同时使用它们,结果几乎相同。两者都在线程使用时锁定资源并阻止另一个线程访问它。

不过,我的问题是:

我什么时候应该使用std::atomicover什么std::mutex时候应该使用std::mutexover std::atomic


以这个简单的类为例。我有三种使用此类来防止的方法data races

使用std::atomic<Buffer>

使用类成员std::atomic<int> m_Data

使用std::mutexstd::lock_guard


注意:RunThread_0RunThread_1你想做的事:他们都调用Buffer::Write方法来改变 member 的值Buffer::m_Data


最后的想法

我一直使用std::mutexand std::lock_guard,但我觉得std::atomic它“更容易”使用,因为您不必担心丢失锁,而如果您使用std::mutex,您可能会不小心错过一条std::lock_guard语句,从而使数据竞争成为可能。

那么,使用std::atomicover有优势std::mutex还是只是设计问题?

0 投票
2 回答
221 浏览

c++ - C++ 互斥锁不起作用 - 同步失败

我想应用尽可能简单的互斥锁。

不幸的是,上面提到的代码没有按预期工作。我希望:

a) sum 总是等于 300
b) counter1 总是 100
c) counter2 总是 0

怎么了?

编辑:

当我在条件中调试sum变量时else,我看到如下值:200、400、100 甚至 0(我假设加法甚至没有发生)。

0 投票
1 回答
131 浏览

go - 这个单例实例实现是否有竞争条件?

有人告诉我memCacheInstance有比赛条件,但go run -race不能说。

代码: