使用ConcurrentStack

Yus*_*tme 4 c# stack multithreading

我需要使用堆栈数据结构来保存字符串.但是这个堆栈将从多个线程访问.所以我的问题是,如何使用ConcurrentStack从多个线程添加数据?

Ste*_*end 10

恭喜,您已选择正确的容器用于多线程使用.整个类是线程安全的,并推荐用于您的场景,因此只需使用PushPushRange适当的派对.

该范围内的示例代码这里使用并行演示多线程操作.


Bri*_*eon 9

到目前为止,您已收到一些非常好的答案.让我提供一些有关其设计的有用信息,以帮助您更好地了解如何使用它.请注意,没有Pop方法.这是因为设计人员希望阻止您执行以下不安全的操作序列.它是不安全的,因为对Count属性和假设Pop方法的调用序列不是原子的,尽管集合被称为线程安全的.

while (stack.Count > 0)
{
  stack.Pop();
}
Run Code Online (Sandbox Code Playgroud)

为了协调这个常见用例,设计人员使用了该TryPop方法.这基本上允许您重写上面的内容,如下所示.这次代码是安全的.

object item;
while (stack.TryPop(out item))
{
  // Do something with the item here.
}
Run Code Online (Sandbox Code Playgroud)

我的第一个例子的推论也存在于该Push方法中.以下代码(这次是合法的)也是不安全的.

if (stack.Count < MAX_ITEMS)
{
  stack.Push(...);
}
Run Code Online (Sandbox Code Playgroud)

后面的例子并不像前者那样常见,这可能就是设计师没有添加类似CAS的等效操作的原因TryPush.也许在将来可以向我们发布的版本中.