98 lines
2.2 KiB
C#
98 lines
2.2 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Threading;
|
|||
|
|
|||
|
namespace DataStructures.ConcurrentHashSet
|
|||
|
{
|
|||
|
[Serializable]
|
|||
|
public class ConcurrentHashSet<T>
|
|||
|
{
|
|||
|
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
|
|||
|
private readonly HashSet<T> _hashSet = new HashSet<T>();
|
|||
|
|
|||
|
//TODO: implement icollection
|
|||
|
public bool Add(T item)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_lock.EnterWriteLock();
|
|||
|
return _hashSet.Add(item);
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (_lock.IsWriteLockHeld)
|
|||
|
{
|
|||
|
_lock.ExitWriteLock();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Clear()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_lock.EnterWriteLock();
|
|||
|
_hashSet.Clear();
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (_lock.IsWriteLockHeld)
|
|||
|
{
|
|||
|
_lock.ExitWriteLock();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool Contains(T item)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_lock.EnterReadLock();
|
|||
|
return _hashSet.Contains(item);
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (_lock.IsReadLockHeld)
|
|||
|
{
|
|||
|
_lock.ExitReadLock();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool Remove(T item)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_lock.EnterWriteLock();
|
|||
|
return _hashSet.Remove(item);
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (_lock.IsWriteLockHeld)
|
|||
|
{
|
|||
|
_lock.ExitWriteLock();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public int Count
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_lock.EnterReadLock();
|
|||
|
return _hashSet.Count;
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (_lock.IsReadLockHeld)
|
|||
|
{
|
|||
|
_lock.ExitReadLock();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|