C# C语言中阻塞集合的等价变量#

C# C语言中阻塞集合的等价变量#,c#,multithreading,blockingcollection,C#,Multithreading,Blockingcollection,这可能有一个明显的答案,但我还是会问 是否存在与C#的阻塞集合等效的变量?我希望我的所有线程都能够访问一个共享变量。它不是一个集合,只是一个共享变量,当每个线程使用它时,它的值将被调整。我喜欢blockingcollection的一点是,ques和locks由C#管理,并且希望对于一个变量也有类似的功能 我可以使用一个公共静态变量,自己创建锁,但我认为应该检查一下 编辑:这是可能的 什么类型的变量以及您希望如何处理此变量 联锁将允许您以原子方式访问变量 这意味着对于基元类型(int、float、

这可能有一个明显的答案,但我还是会问

是否存在与C#的阻塞集合等效的变量?我希望我的所有线程都能够访问一个共享变量。它不是一个集合,只是一个共享变量,当每个线程使用它时,它的值将被调整。我喜欢blockingcollection的一点是,ques和locks由C#管理,并且希望对于一个变量也有类似的功能

我可以使用一个公共静态变量,自己创建锁,但我认为应该检查一下


编辑:这是可能的

什么类型的变量以及您希望如何处理此变量

联锁将允许您以原子方式访问变量

这意味着对于基元类型(int、float、object ref),您可以以原子的方式执行一些基元操作(增量、交换值等),从而实现线程安全。例如,如果希望计数器从多个线程递增/递减,这可能是一个很好的解决方案

其他(更强大的)用途包括条件原子交换(conditional atomic swap),这是软件事务内存习惯用法的一部分,允许在不使用其他同步机制(如互斥)的情况下从多个线程安全地更改变量

但是,联锁操作必须在硬件级别执行一些锁定,因此会有一定的性能损失,而不是多线程数据访问和竞争条件的魔杖


而且,它们只对基本类型和操作起作用。同时在几个类型上交叉执行几个操作需要更多的连接,互锁类不直接支持。

这可能有助于您使用
互斥锁
(或其他替代方法)。没有内置的“线程安全变量”,因为一开始就没有意义。在get或集合中管理线程同步是毫无意义的——您应该做的是使使用变量线程的代码安全。如果您希望强制执行的变量有特定的逻辑(假设
int
),则可以将其表示为一个类,方法包括
ResetToZero
AddOne
CheckEven
,等等,并使该类具有线程安全性。同步需要阻塞代码,对于变量是不可能的。使变量线程安全是深入研究的主题,称为STM(软件事务内存),它似乎无法应用到我们的机器上。STM最大的问题是,还没有人证明它是实用的,还没有人基于STM创建了一个操作系统。我同意@HansPassant,而且这个问题过于宽泛。实际用例和代码示例肯定会增加一些价值,否则它更适合其他StackExchange组(例如程序员)或论坛。总结:根据我使用TPL的实践经验,我发现ConcurrentStack、ConcurrentQueue、ConcurrentDictionary(TKey、TValue)的使用非常好。将MaxDegreeOfParallelism设置为CPU核数时,它的工作效率相当高。顺致敬意,