Изобретен класс что-то типа Mutex'a.
От: BlackBox Россия ---
Дата: 31.07.02 09:13
Оценка: 20 (2)
Привет всем!

Вот написал маленький класс и думаю не изобрел ли я велосипед (в который раз... )

Как его обозвать даже не знаю, и как описать тоже, но попробую.

Итак, имеется у нас объект. Его можно Open и Release (по аналогии с mutex'oм). Открыть его можно только N раз, как только все его освободили то у нас устанавливается событие. Как только его кто-то открыл тоже устанавливается событие, но другое. Пока писал эти строки, пришло в голову, что N раз это не принципиально. Вот вообщем-то и все.
Можно пользовать в многопоточном приложении (для этого и задумывался), но есть сумнения. может вы, уважаемый алл, подскажите (выделенно жирным).

// - header ---
class CBlackMutex
{
  int Size;
  long ResCount;
  HANDLE hEvents[2];
public:
  __fastcall CBlackMutex(int sz=5);
  __fastcall ~CBlackMutex();
  bool __fastcall Open();
  bool __fastcall Release();

  HANDLE GetEmpty(){return hEvents[1];}
  HANDLE GetOpened(){return hEvents[0];}

};
// - code ---
__fastcall CBlackMutex::CBlackMutex(int sz)
{
  if (sz <= 0) sz = 1;
  Size = sz;
  ResCount = 0;
  hEvents[0] = hEvents[1] = NULL;
  hEvents[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
  hEvents[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
}

__fastcall CBlackMutex::~CBlackMutex()
{
  if (hEvents[0] != NULL) CloseHandle(hEvents[0]);
  if (hEvents[1] != NULL) CloseHandle(hEvents[1]);
  hEvents[0] = hEvents[1] = NULL;
}

bool __fastcall CBlackMutex::Open()
{
  if (InterlockedExchangeAdd(&ResCount, 0) == Size) return false;
  if (InterlockedExchangeAdd(&ResCount, 0) == 0)
  {
    SetEvent(hEvents[0]);   // нет проверки ошибок...
  }
  InterlockedExchangeAdd(&ResCount, 1);           // multithreading ++ :D
  return true;
}
bool __fastcall CBlackMutex::Release()
{
  if (InterlockedExchangeAdd(&ResCount, 0) == 0) return false;
  InterlockedExchangeAdd(&ResCount, -1);          // multithreading -- :D
  if (InterlockedExchangeAdd(&ResCount, 0) == 0)
  {
    SetEvent(hEvents[1]);   // нет проверки ошибок...
  }
  return true;
}


Принимается любая критика по поводу кода.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.