多线程数组线程安全吗?

时间:2019-10-15 13:52:30

标签: c# multithreading

我有这样的代码,一些线程将生成字符串(此处为100)并存储到数组,其他单个线程将使用索引器[]读取数据并保存到文件。我在ThreadSafeString类中使用Interlocked类进行字符串交换,但是我不知道它是否足以避免死锁和非线程安全问题。我的另一个想法是使用ConcurrentModificationException以确保其安全。

ConcurrentDirectory<int, string>

2 个答案:

答案 0 :(得分:2)

我在这里看不到ThreadSafeString中的一点。如果您需要通过一次操作比较,存储和返回旧数据,请使用Interlocked.CompareExchange

Interlocked.CompareExchange(ref _string, null, null);

表示

if (_string == null)
{
    _string = null;
    return null;
} else return _string;

,但作为单个操作。如您所见,可以轻松地将其替换为

return __string;

Interlocked.Exchange相同-您不需要对字符串进行操作:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/variables#atomicity-of-variable-references

  

以下数据类型的读写是原子的:bool,char,   字节,字节,短型,ushort,uint,int,浮点型和引用类型。

您仅需要对其他类型执行此操作,并且如果您需要获取旧值作为原子操作,则只需执行此操作。 只需在此处使用string[]就具有相同的线程安全性。只要不更改数组大小并且不对引用类型或单个单词大小的值类型进行操作,就可以安全地从数组中存储和读取数据。您只需要担心线程安全,就可以读取,更改和存储数据,但这是ConcurrentDirectory

这样的集合甚至无法解决的另一个问题。

答案 1 :(得分:1)

编辑: 为了反映您的评论,我改为使用input { beats { port => 9300 tags => ["beats"] } } input { kafka { bootstrap_servers => "localhost:9092" topics => ["my-topic"] codec => json tags => ["kafka"] } } output { if "beats" in [tags] { output for beats } if "kafka" in [tags] { output for kafka } }

字典将注意线程的线程安全读写。

ConcurrentDictionary