gpt4 book ai didi

c# - 'thread safe' 对象是什么意思?

转载 作者:太空狗 更新时间:2023-10-29 20:44:09 26 4
gpt4 key购买 nike

我在 C# 集合中使用了通用队列,每个人都说由于线程安全,最好使用 System.Collection.Generic.Queue 的对象。

请告知使用 Queue 对象的正确决定,以及它如何保证线程安全?

最佳答案

“线程安全”这个词有点令人不快,因为它并没有真正可靠的定义。基本上,这意味着当通过多个线程对对象进行操作时,可以保证对对象的某些操作行为合理。

考虑最简单的例子:一个计数器。假设您有两个递增计数器的线程。如果事件的顺序是:

  • 线程一从计数器读取,得到零。
  • 线程二从计数器读取,获取零。
  • 线程一递增零,写入一个来反击。
  • 线程两次递增零,写入一个反击。

然后注意计数器如何“丢失”其中一个增量。计数器上的简单增量操作不是线程安全的;为了使它们成为线程安全的,您可以使用锁或 InterlockedIncrement。

与队列类似。非线程安全队列可以“丢失”排队,就像非线程安全计数器可以丢失增量一样。更糟糕的是,如果您在多线程场景中使用不当,非线程安全队列甚至会崩溃或产生疯狂的结果。

“线程安全”的难点在于它没有明确定义。它只是意味着“不会崩溃”吗?这是否意味着会产生合理的结果?例如,假设您有一个“线程安全”集合。这个代码正确吗?

if (!collection.IsEmpty) Console.WriteLine(collection[0]);

没有。即使集合是“线程安全的”,也不意味着这段代码是正确的;另一个线程可能在检查之后但在写入行之前使集合为空,因此此代码可能会崩溃,即使该对象据称是“线程安全的”。实际上,确定每个相关的操作组合都是线程安全的是一个极其困难的问题。

现在来看看你的实际情况:任何告诉你“你应该使用 Queue 类,因为它是线程安全的更好”的人可能并不清楚他们在说什么。首先,队列不是线程安全的。其次,如果您仅在单个线程上使用该对象,则 Queue 是否是线程安全的完全无关紧要!如果您有一个要在多个线程上访问的集合,那么,正如我在上面的示例中指出的那样,无论集合本身是否“线程安全”,您都会遇到一个非常难以解决的问题。您必须确定您对集合执行的每个操作组合也是线程安全的。这是一个非常困难的问题,如果您遇到了这个问题,那么您应该使用专家的服务来解决这个难题。

关于c# - 'thread safe' 对象是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1552637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com