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

)
Как его обозвать даже не знаю, и как описать тоже, но попробую.
Итак, имеется у нас объект. Его можно 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;
}
Принимается любая критика по поводу кода.