Шаг 334 - Семафор в MFC

Для подробного ознакомления лучше прочитать 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();
}

В момент обращения к данному объекту класса из разных потоков меняется счетчик. Если вдруг больше трех потоков обратятся к этому объекту, то третий будет дожидаться пока первый и второй освободят ресурс. Например, можно в ресурсы поместить видео файл и обернуть его в такую оболочку. В результате только два потока смогут получить к нему доступ и показать, одновременно я имею в ввиду (не обязательно синхронно), или только в двух окнах.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 1.05.2001