Critical.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #pragma once
  2. #include <condition_variable>
  3. #include "Betriebssystem.h"
  4. namespace Framework
  5. {
  6. class Thread;
  7. class Critical
  8. {
  9. private:
  10. CRITICAL_SECTION cs;
  11. Thread* owner;
  12. int lockCount;
  13. int id;
  14. public:
  15. //! Konstructor
  16. DLLEXPORT Critical();
  17. //! Destructor
  18. DLLEXPORT ~Critical();
  19. //! sperrt das Objekt
  20. DLLEXPORT void lock();
  21. //! versucht das Objekt zu sperren
  22. DLLEXPORT bool tryLock();
  23. //! entsperrt das Objekt
  24. DLLEXPORT void unlock();
  25. //! gibt true zurück, wenn das Objekt gesperrt ist
  26. DLLEXPORT bool isLocked() const;
  27. //! gibt einen Zeiger auf den Thread zurück, der das Objekt gesperrt hat
  28. DLLEXPORT const Thread* zOwner() const;
  29. };
  30. class CriticalLock
  31. {
  32. private:
  33. Critical* critical;
  34. public:
  35. DLLEXPORT CriticalLock(Critical* critical);
  36. DLLEXPORT ~CriticalLock();
  37. };
  38. #define LOCK(x) CriticalLock _lock(x)
  39. #define LOCKN(x, i) CriticalLock _lock_##i(x)
  40. class Synchronizer
  41. {
  42. private:
  43. std::condition_variable block;
  44. std::mutex mutex;
  45. int numWaiting;
  46. bool skip;
  47. public:
  48. DLLEXPORT Synchronizer();
  49. DLLEXPORT ~Synchronizer();
  50. DLLEXPORT bool wait();
  51. DLLEXPORT bool wait(int milisec);
  52. DLLEXPORT void notify();
  53. DLLEXPORT void notify(int amount);
  54. DLLEXPORT void notifyAll();
  55. DLLEXPORT int getNumberOfWaitingThreads() const;
  56. };
  57. } // namespace Framework