Jon
Jon

Reputation: 40032

Concurrent Dictionary Correct Usage

Am I right in thinking this is the correct use of a Concurrent Dictionary

private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>();

//Main thread at program startup

for(int i = 0; i < 4; i++)
{
  myDic.Add(i, 0);
}

//Separate threads use this to update a value

myDic[InputID] = newLongValue;

I have no locks etc and am just updating the value in the dictionary even though multiple threads might be trying to do the same.

Upvotes: 102

Views: 115668

Answers (5)

Antonio Leonardo
Antonio Leonardo

Reputation: 1862

Just a note: Does not justify using a ConcurrentDicitonary object with a linear loop, making it underutilized. The best alternative is to follow the recommendations of the Microsoft Documentation, as mentioned by Oded using Parallelism, according to the example below:

Parallel.For(0, 4, i => 
{
   myDic.TryAdd(i, 0);
});

Upvotes: 3

Onur
Onur

Reputation: 902

It depends, in my case I prefer using this method.

ConcurrentDictionary<TKey, TValue>.AddOrUpdate Method (TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>);

See MSDN Library for method usage details.

Sample usage:

results.AddOrUpdate(
  Id,
  id => new DbResult() {
     Id = id,
     Value = row.Value,
     Rank = 1
  },
  (id, v) =>
  {
     v.Rank++;
     return v;
  });

Upvotes: 1

Erdem
Erdem

Reputation: 105

Best way to find this out is check MSDN documentation.

For ConcurrentDictionary the page is http://msdn.microsoft.com/en-us/library/dd287191.aspx

Under thread safety section, it is stated "All public and protected members of ConcurrentDictionary(Of TKey, TValue) are thread-safe and may be used concurrently from multiple threads."

So from concurrency point of view you are okay.

Upvotes: 5

Oded
Oded

Reputation: 499002

It depends on what you mean by thread-safe.

From MSDN - How to: Add and Remove Items from a ConcurrentDictionary:

ConcurrentDictionary<TKey, TValue> is designed for multithreaded scenarios. You do not have to use locks in your code to add or remove items from the collection. However, it is always possible for one thread to retrieve a value, and another thread to immediately update the collection by giving the same key a new value.

So, it is possible to get an inconsistent view of the value of an item in the dictionary.

Upvotes: 89

Jan
Jan

Reputation: 16042

Yes, you are right.

That and the possibility to enumerate the dictionary on one thread while changing it on another thread are the only means of existence for that class.

Upvotes: 4

Related Questions