Для подробного ознакомления лучше прочитать MFC: "Шаг 332 - MFC и синхронизация", MSDN: "Шаг 81 - Что такое семафоры (Semaphore)", API: "Шаг 117 - CreateSemaphore, ReleaseSemaphore".
В MFC для работы с семаформами есть специальный класс CSemaphore. Объявить это класс можно вот так:
CSemaphore semaphore(2,2);
или так:
СSemaphore *semaphore; semaphore = new CSemaphore(2,2);
Второй конструктор нужен для того, чтобы объект можно было помещать в класс, но у него есть параметры и поэтому создавать его нужно будет динамически. Параметры у конструктора такие:
CSemaphore ( LONG lInitialCount = 1, // начальное состояние LONG lMaxCount = 1, // максимальное значение LPCTSTR pstrName = NULL, // имя LPSECURITY_ATTRIBUTES lpsaAttributes = NULL // атрибут защиты );
Используется он так. Объявляется в классе:
class CMyResource { private: СSemaphore *semaphore; public: CMyResource(); ~CMyResource(); void UseResource(); } CMyResource::CMyResource() { semaphore = new CSemaphore(2,2); } CMyResource::~CMyResource() { delete semaphore; }
Теперь в классе есть семафор. Что нужно сделать, чтобы при обращении к ресурсам счетчик работал ? Сказать ему об этом.
void CMyResource::UseResource() { CSingleLock singlelock(semaphore); singlelock.Lock(); ...... singlelock.UnLock(); }
В момент обращения к данному объекту класса из разных потоков меняется счетчик. Если вдруг больше трех потоков обратятся к этому объекту, то третий будет дожидаться пока первый и второй освободят ресурс. Например, можно в ресурсы поместить видео файл и обернуть его в такую оболочку. В результате только два потока смогут получить к нему доступ и показать, одновременно я имею в ввиду (не обязательно синхронно), или только в двух окнах.