Визуальное программирование и MFC



         

Работа с семафорами - часть 2


Добавим в класс CExampleView объект-семафор:

class CExampleView : public CView { protected: // только один поток сможет одновременно обращаться к ресурсу CSemaphore sem; // другие описания класса ..... };

Далее при обработке сообщения от меню создадим два потока. В каждой из функций этих потоков объект-семафор используется для разграничения доступа потоков к ресурсам:

UINT MyThread1(LPVOID pParam); UINT MyThread2(LPVOID pParam); void CExampleView::OnStart() { AfxBeginThread(MyThread1,this); AfxBeginThread(MyThread2,this; } UINT MyThread1(LPVOID pParam) { CExampleView *ptrView=(CExampleView *)pParam; CSingleLock syncObj(&(ptrView->sem)); ....... syncObj.Lock(); // получение семафора действия, связанные с доступом к ресурсу syncObj.Unlock(); // освобождение семафора ....... return 0; } UINT MyThread2(LPVOID pParam) { CExampleView *ptrView=(CExampleView *)pParam; CSingleLock syncObj(&(ptrView->sem)); ....... syncObj.Lock(); // получение семафора действия, связанные с доступом к ресурсу syncObj.Unlock(); // освобождение семафора ....... return 0; }

В каждой из функций потока создается объект типа CsingleLock на базе семафора, а затем вызывается метод Lock. Когда первый поток получает доступ к семафору, другой поток приостанавливается до тех пор, пока первый поток не освободит семафор с помощью функции Unlock. Таким образом, семафор в данном примере предоставляется только одному потоку. Это напоминает работу с исключающим семафором.




Содержание  Назад  Вперед