КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Использование исключающего семафора
Исключающие семафоры или мьютексы (mutex) во многом похожи на критические секции, но являются несколько более сложными объектами, так как обеспечивают безопасное разделение ресурсов не только потоками одного приложения, но также потоками различных приложений. Рассмотрим текст файла заголовка CountArray2.h для класса СCountArray2. За исключением нового имени класса и объекта мьютекс, этот файл идентичен предыдущей версии файла CountArray.h.
#include "afxmt.h" class CCountArray2 { private: int array[10]; CMutex mutex; public: CCountArray2() {}; ~CCountArray2() {}; void SetArray(int value); void GetArray(int dstArray[10]); }
Ниже приведен текст исходного файла CountArray2.cpp, реализующего этот модифицированный класс.
#include "stdafx.h" #include "CountArray2.h" void CCountArray2::SetArray(int value) { CSingleLock singleLock(&mutex); singleLock.Lock(); for (int x=0; x<10; ++x) array[x] = value; } void CCountArray2::GetArray(int dstArray[10]) { CSingleLock singleLock(&mutex); singleLock.Lock(); for (int x=0; x<10; ++x) dstArray[x] = array[x]; } Для получения доступа к объекту мьютекс необходимо создать объект класса CSingleLock для объекта mutex, как показано ниже:
CSingleLock singleLock(&mutex);
Аргумент конструктора является указателем на обеспечивающий синхронизацию потоков объект, с помощью которого и осуществляется управление. Затем для получения доступа к мьютексу вызывается метод Lock() объекта класса CSingleLock:
singleLock.Lock();
Если мьютекс еще не захвачен, то вызывающий поток становится его владельцем. Если владельцем мьютекса уже является другой поток, система приостанавливает работу вызывающего потока до тех пор, пока мьютекс не будет освобожден, после чего ожидающий поток сможет получить его в свое распоряжение и продолжить работу. Для освобождения мьютекса необходимо вызвать метод Unlock() класса CSingleLock. Но поскольку вы создали экземпляр класса CSingleLock в стеке (а не в куче с помощью оператора new), то вызывать Unlock() вообще нет необходимости. Когда функция SetArray() завершит свою работу, объект выйдет из области видимости, что приведет к вызову его деструктора, который автоматически освободит объект.
Варианты индивидуального задания 1. Разработать приложение, которое может запускать один (поток Red), два (потоки Red и Green) или три потока (потоки Red, Green, Blue). Каждый из потоков рисует прямоугольники своим цветом и в своей области окна представления. Предусмотреть команду остановки выполнения потоков. 2. Разработать приложение, которое может запускать один (поток Red), два (потоки Red и Green) или три потока (потоки Red, Green, Blue). Каждый из потоков выводит символ своим цветом и в своей области окна представления. Предусмотреть команду остановки выполнения потоков. 3. Разработать приложение, которое может запускать потоки Red, Green, и Blue. Каждый из потоков рисует окружности своим цветом. Предусмотреть команду остановки выполнения потоков. 4. Организовать доступ к файлу на диске из двух различных потоков. В файле хранится информация о банковском счете. Первый поток увеличивает значение счета на 1 в одну секунду. Второй поток выводит в окно AfxMessageBox величину счета в произвольный момент времени. Для синхронизации доступа к данным использовать объект критической секции. Предусмотреть команду остановки выполнения потоков. 5. Организовать вывод в главное окно приложения фразу, состоящую из двух частей. Первая часть фразы формируется первым потоком, вторая часть– вторым. Для синхронизации доступа к данным использовать объект события. Предусмотреть команду остановки выполнения потоков. 6. Организовать запись в файл строки, состоящей из двух частей. Первая часть строки есть “Сумма = ”. Вторая часть строки есть число, которое формируется первым потоком путем добавления единицы каждую секунду. Второй поток выводит полученную строку в файл. Для синхронизации доступа к данным использовать объект семафора. Предусмотреть команду остановки выполнения потоков. 7. Разработать приложение, которое выводит диалоговую панель с кнопкой «Start» и списком List box. По кнопке «Start» организуется запуск потока, который заполняет список некоторыми значениями. 8. Разработать приложение, которое выводит диалоговую панель с кнопкой «Array» и списком List box. По кнопке «Array» организуется запуск четырех потоков. Первый запускает функцию обнуления массива. Второй выводит обнуленный массив в List box. Третий заполняет массив некоторыми значениями. Четвертый выводит заполненный массив в List box. Синхронизацию потоков осуществить с помощью исключающего семафора (Mutex).
Дата добавления: 2014-11-29; Просмотров: 674; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |