问题标签 [interlocked]

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 回答
1037 浏览

.net - Mono 上的 Interlocked.Read / Interlocked.Exchange 比 .NET 慢得多?

很抱歉这个问题很长,但是有一个 Jon Skeet 参考资料,所以这对某些人来说可能是值得的。

简而言之:
Interlocked.Read /Interlocked.Exchange在 Mono 框架中运行时似乎比在 .NET 框架中运行时执行得慢得多。我很想知道为什么。

长篇大论:
我想要一个适用于 32 位平台的线程安全双精度,所以我制作了这个结构:

然后我读了 Jon Skeet 对这个问题的回答,所以我做了这个结构:

然后我写了这个测试:

我使用 .NET 框架得到了这个结果: .NET 联锁测试结果

这个结果使用 Mono 框架: 单声道联锁测试结果

我在同一台机器(Windows XP)上多次运行这两项测试,结果是一致的。我很想知道为什么 Interlocked.Read/Interlocked.Exchange 似乎在 Mono 框架上执行得这么慢。

更新:

我写了以下更简单的测试:

.NET 框架始终返回约 2.5ExchangeRead. Mono 框架返回约 5.1秒。

0 投票
3 回答
1720 浏览

c# - 如何:编写一个只能调用一次的线程安全方法?

我正在尝试编写一个线程安全的方法,它只能被调用一次(每个对象实例)。如果之前已经调用过,应该抛出异常。

我想出了两个解决方案。他们都正确吗?如果不是,他们有什么问题?

  1. lock

    /li>
  2. Interlocked.CompareExchange

    如果我没记错的话,这个解决方案的优点是无锁(这在我的情况下似乎无关紧要),并且它需要更少的私有字段。

我也愿意接受合理的意见,应该首选哪种解决方案,如果有更好的方法,我也会提出进一步的建议。

0 投票
2 回答
1828 浏览

winapi - InterlockedCompareExchange Release() 和 Acquire() 有什么区别?

InterlockedCompareExchangeRelease()和有什么区别InterlockedCompareExchangeAcquire()

当我尝试使用 WIN32 API 学习同步函数时,我发现有两个函数名称不同但似乎做同样的事情:

我查看了 MSDN,它说这些功能是:

对指定值执行原子比较和交换操作。该函数比较两个指定的 32 位值并根据比较结果与另一个 32 位值进行交换。

但是对于InterlockedCompareExchangeAcquire(),

该操作是通过获取内存访问语义执行的。

并且对于InterlockedCompareExchangeRelease(),

交换是使用释放内存访问语义执行的。

所以我很好奇这两个函数之间的区别。何时使用获取内存访问语义释放内存访问语义?有没有例子?

谢谢!

0 投票
3 回答
2353 浏览

c# - How should I increment a number for a round robin threading scenario with least contention?

If many threads are calling GetNextNumber simultaneously with the following code, GetNextNumber will return 1 more times than any other numbers.

Is there a way to reset the _lastNumber back to one, and reliably return an incremented number for each thread calling GetNextNumber(), without having to use a lock?

0 投票
0 回答
158 浏览

visual-c++ - 逆向工程频繁联锁Increment/Decrement

我试图对一些代码进行逆向工程并多次遇到一个常见的模式,但我不确定它会是什么。该代码是使用 VC++ 2010 编译的,并使用一些外部 CLR 组件进行显示(但据我所知,不适用于任何内部组件)。

我看到的一些模式是在一些返回对象的函数中,它们要么:

  • InterlockedIncrementobj_ptr - 12返回之前做一个
  • 检查InterlockedDecrementon的结果obj_ptr - 12,如果结果为 0,则调用*(*(obj_ptr - 24) + 64)(obj_ptr - 24)

它看起来像一些基于引用计数的 GC,并急切地调用析构函数。任何人都可以确认这是否正确,还是其他系统?

如果那是正确的 - 我可以看到一些已知的界面吗?我想知道我是否可以假设在返回值之前进行增量的地方可以假设为该类型的“新”的一些扩展版本。

另外,我在哪里可以找到有关此的更多信息?看起来这不能是标准对象的 vtable 的一部分,我希望它是前面的短指针。也许是 RTTI ......但我找不到任何关于它的布局的好例子。我不希望这里有任何多重继承会使基类更进一步。

0 投票
2 回答
506 浏览

c# - 什么时候应该和不应该使用这个 C# 实用程序类来通过 Interlocked 控制线程

我试图了解如何编写此类背后的逻辑,以及何时应该和不应该使用它。任何见解将不胜感激

更新:我在我的源代码中找到了一个示例用法......这表明如何使用上述对象,虽然我不明白“为什么”

0 投票
2 回答
3121 浏览

c# - 线程池是否会排队一个定时器的回调函数,有时会同时调度多个线程?

在下面的代码中TimerRecalcStatisticsElapsed应该只运行一个实例。此回调调用的工作方法按顺序运行,一次最多运行一个线程

问题第 1 部分:

如果计时器的回调运行一个线程池线程(而不是在单独的线程上运行回调),那么说线程池可能会排队并推迟线程以供以后执行基于条件(达到 MaxThreads,线程池内部逻辑)是否正确?

问题第 2 部分:

假设一个计时器回调可以排队等待除立即执行之外的任何事情,这是否意味着任意数量的线程回调可以同时执行?

问题第 3 部分

假设第 2 部分为真,这是否意味着下面的代码可以同时运行多个回调?

我问的原因是因为有数千个此类的实例在多 CPU 服务器上运行。我还看到数据损坏与// Do Work Here.

在旁边

// Do work here在内部使用 System.Collections.Dictionary 并编辑 y 的值。它还为串行调用的后续函数删除了一些键。该函数缺少以前在第一次调用中存在的键 (x)。我认为这是因为最终陈述存在竞争条件obj.cleanupdata()

0 投票
1 回答
91 浏览

.net - .net System.MemberwiseClone 和联锁写入

执行值类型数组的 MemberwiseClone 时:

如果使用其他线程上的互锁写入来修改这些双精度数,MemberwiseCloned 副本是否有任何损坏双精度数的风险?我不关心稍微陈旧的值,只是撕裂以及 interlocked 和 memberwiseclone 之间的交互(我猜这会转化为内存 blit 类型的操作?)

0 投票
1 回答
426 浏览

c# - 使用 Interlocked.CompareExchange

伙计们,

我希望您评估下面的下一个代码。如您所见,我使用 Interlocked.CompareExchange,在这种情况下有意义吗?(我不确定,它是否正确)。

我会很高兴任何笔记、评论等。

谢谢你提前。

0 投票
2 回答
1111 浏览

c# - 检查ThreadPool线程何时完成的正确方法?

我正在寻找一种检查线程池中的所有线程何时完成任务的方法。目前我正在使用一个计数器,当线程完成它的工作以及counter == 0我调用我的WorkComplete方法时它会递减。这似乎可行,但是当我到达最后的“工作”时,它似乎没有处理结果?或者至少用户界面没有得到它。这是我目前拥有的:

排队工作项 + 递增计数器

做工作:

但是处理的 URL 的数量总是比总数少一个,这几乎就像最后一个线程不是“报告回来”之类的。有没有人有任何想法?

谢谢