Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. lock(someObject)
  2. {
  3. // Thread safe code here.
  4. }
  5.  
  6. using System.Collections.Concurrent;
  7.  
  8. namespace System.Threading.More {
  9. public class ConditionVariable {
  10. private readonly ConcurrentQueue<ManualResetEventSlim> _waitingThreads = new ConcurrentQueue<ManualResetEventSlim>();
  11.  
  12. /// <summary>
  13. /// Atomically unlocks and waits for a signal.
  14. /// Then relocks the mutex before returning
  15. /// </summary>
  16. /// <param name="mutex"></param>
  17. public void Wait(Mutex mutex) {
  18. if (mutex == null) {
  19. throw new ArgumentNullException("mutex");
  20. }
  21. var waitHandle = new ManualResetEventSlim();
  22. try {
  23. _waitingThreads.Enqueue(waitHandle);
  24. mutex.ReleaseMutex();
  25. waitHandle.Wait();
  26. } finally {
  27. waitHandle.Dispose();
  28. }
  29. mutex.WaitOne();
  30. }
  31.  
  32. public void WaitRead(ReaderWriterLockSlim readerWriterLock) {
  33. if (readerWriterLock == null) {
  34. throw new ArgumentNullException("readerWriterLock");
  35. }
  36. var waitHandle = new ManualResetEventSlim();
  37. try {
  38. _waitingThreads.Enqueue(waitHandle);
  39. readerWriterLock.ExitReadLock();
  40. waitHandle.Wait();
  41. } finally {
  42. waitHandle.Dispose();
  43. }
  44. readerWriterLock.EnterReadLock();
  45. }
  46.  
  47. public void Signal() {
  48. ManualResetEventSlim waitHandle;
  49. if (_waitingThreads.TryDequeue(out waitHandle)) {
  50. waitHandle.Set();
  51. }
  52. }
  53.  
  54. public void Broadcast() {
  55. ManualResetEventSlim waitHandle;
  56. while (_waitingThreads.TryDequeue(out waitHandle)) {
  57. waitHandle.Set();
  58. }
  59. }
  60. }
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement