Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';最大值是多少(螺纹、联锁、增量(偏移量)、偏移量-1)?_C#_.net_Multithreading - Fatal编程技术网

C# 什么';最大值是多少(螺纹、联锁、增量(偏移量)、偏移量-1)?

C# 什么';最大值是多少(螺纹、联锁、增量(偏移量)、偏移量-1)?,c#,.net,multithreading,C#,.net,Multithreading,我已经在好几个场合看到了上面提到的代码,做aMax(a+1,a-1)有什么意义?起初我认为这可能是为了防止下溢,但在这种情况下不防止下溢是没有意义的。好吧,这与Max(a,a-1)不同,因为需要调用interlocated.Increment。假设另一个线程在调用Interlocked.Increment和计算Offset-1之间更改偏移量的值 但是,这对我来说仍然很奇怪,因为除非Offset是可变的,否则后一个表达式可能不会得到最新的值 说了这么多,代码不可能完全正确 因为interlocat

我已经在好几个场合看到了上面提到的代码,做a
Max(a+1,a-1)
有什么意义?起初我认为这可能是为了防止下溢,但在这种情况下不防止下溢是没有意义的。

好吧,这与
Max(a,a-1)
不同,因为需要调用
interlocated.Increment
。假设另一个线程在调用
Interlocked.Increment
和计算
Offset-1
之间更改偏移量的值

但是,这对我来说仍然很奇怪,因为除非
Offset
是可变的,否则后一个表达式可能不会得到最新的值

说了这么多,代码不可能完全正确

因为
interlocated.Increment
的参数是
ref
参数。最接近的法律法规是:

Math.Max(Interlocked.Increment(ref Offset), Offset-1)
(这仍然很奇怪,因为它意味着一个Pascal大小写变量…)


也许,如果你能在上下文中显示确切的代码,我们就可以解决这个问题。我不能说我自己见过这样的代码。

互锁。增量(a)
以原子方式递增
a的值。在单线程应用程序中,它相当于
a++
,但速度稍慢。在多线程应用程序中,它确保当两个线程都增加值时,它们不会相互干扰。有关更多详细信息,请参阅


为什么在这种情况下使用它,我不能不看到更多的代码。

正如您所提到的,他们可能试图检测
Offset
何时变为零(或变为负值),并将其固定在任何类型的
Offset
的最大值。或者,他们可能试图处理多个线程(或其他)中的
偏移量“同时”递增的情况

无论哪种情况,这都是错误代码

如果他们试图检测/防止换行为零或负,则增量过多将导致问题。如果他们试图处理“同时”递增的
Offset
,我不确定他们真正想解决的问题是什么,或者他们是如何解决的

以下是问题:

:

然而,这对我来说仍然很奇怪,因为除非偏移量是可变的,否则后一个表达式可能不会得到最新的值

但比这更糟糕的是,即使
Offset
是易变的,也没有任何东西可以序列化读取
Offset
的新值,而另一个线程可能会增加它,因此
Max()之后的瞬间
expression重新读取
Offset
的值,任何数量的其他线程可能会出现并增加它(任意次数)。因此,该表达式充其量是无用的,但使用该技术可能是有害的,因为您可能最终使用了一个不属于您的值
Offset

考虑使用
Offset
跟踪数组索引或其他内容的情况(给定的名称听起来很像可能发生的事情)。当您以原子方式递增
Offset
时,该索引处的数组元素将由您使用。如果像问题中那样使用
Max()
表达式,可能会突然踩到真正属于另一个线程的数组元素

我想不出一个合理的理由来使用它

Max(Threading.Interlocked.Increment(Offset), Offset - 1)
正如我所说,它充其量是无害的(而且没有用处),但它可能会导致诊断问题非常困难-不要使用它


多亏了Simon Svensson的评论,他指出了谷歌搜索问题中的用法,看起来这段代码通常(总是?)来自C#到VB.NET转换器的输出。它甚至使用这个表达式来增加局部变量(所以线程不是问题)。在
Offset
是局部变量的情况下,此表达式属于无用但基本无害的类型(如果增量换行,则会出现“bug”)。这实际上或多或少是一个非常低效的
Offset++
表达式(实际上,它似乎是转换器将C#expression
Offset++
转换为VB.NET的方式-请参阅)。实际上,这种转换对于偏移量+++
来说是有问题的,因为它在应该返回递增之前的值时返回递增的值


真正糟糕的是,其他人可能会看到这些代码,然后想,“这就是我需要使用
interlocated.Increment()

一点谷歌搜索让我怀疑这可能是由一些C到VB.NET转换器软件(可能有缺陷)引起的。这就解释了它经常出现的原因

补充道:是的,我!尝试在其中输入以下C#代码并转换为VB.NET:

int i;
i++;

我忘了我最初在哪里看到的代码。我想是在读一篇关于套接字的文章时。但是在google上快速搜索代码片段会提供许多正在使用的代码示例,然后我建议您选择一个,更新您的问题,然后我们可以讨论一个特定的示例,而不是一般性的示例:)@Jon,我相信VB.NET不使用ref关键字。检查我们的许多使用此。。。techn/myst ique@Simon:这个问题被标记为C。我不打算开始讨论任意的样本——这只会导致相互误解。如果OP想选择一个例子,这将使对话更加富有成效。感谢Simon的代码示例-我根据您的指针在我的答案中添加了有关此代码来源的信息。
int i;
i++;