HuB*_*eZa 2 .net c# multithreading dictionary readerwriterlockslim
我写了一小段代码,可以快速读取和写入多个线程的字典.我使用ReaderWriterLockSlim来保护代码,并且仍然收到了涉嫌尝试添加重复密钥的异常.
ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
Dictionary<int, int> _dict = new Dictionary<int, int>();
public SafeDictionaryTester()
{
for (int i = 0; i < 7; i++)
{
_dict.Add(i, i);
}
}
internal void Execute()
{
for (int i = 7; i < 10000; i++)
{
if (i % 6 == 0)
new Thread(new ThreadStart(delegate { Print(6); })).Start();
else if (i % 5 == 0)
new Thread(new ThreadStart(delegate { Print(5); })).Start();
else if (i % 4 == 0)
new Thread(new ThreadStart(delegate { Print(4); })).Start();
else if (i % 3 == 0)
new Thread(new ThreadStart(delegate { Print(3); })).Start();
else if (i % 2 == 0)
new Thread(new ThreadStart(delegate { Print(2); })).Start();
else if (i % 1 == 0)
new Thread(new ThreadStart(delegate { Print(1); })).Start();
new Thread(new ThreadStart(delegate
{
_lock.EnterWriteLock();
try
{
_dict.Add(i, i); // Exception after random number of loops
Console.WriteLine(i.ToString() + " added");
}
finally
{
_lock.ExitWriteLock();
}
})).Start();
}
}
private void Print(int i)
{
_lock.EnterReadLock();
try
{
int obj;
if (_dict.TryGetValue(i, out obj))
{
Console.WriteLine(obj);
}
else
{
throw new Exception();
}
}
finally
{
_lock.ExitReadLock();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,没有线程的确切代码执行完美.
问题是,你的匿名作者的委托创建一个闭合了i.
也就是说,当你写线程执行,他们将使用的电流值的i的时间,而不是价值线程开始(7,8,9 ...等)
要修复它,您需要在for循环中复制变量并在编写器委托中使用它:
internal void Execute()
{
for (int i = 7; i < 10000; i++)
{
// trimmed for brevity: create a copy of i
int copy = i;
new Thread(new ThreadStart(delegate
{
_lock.EnterWriteLock();
try
{
_dict.Add(copy, copy); // Exception after random number of loops
Console.WriteLine(copy.ToString() + " added");
}
finally
{
_lock.ExitWriteLock();
}
})).Start();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1193 次 |
| 最近记录: |