пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Потоки в Visual C++. Работа с исключающим семафором.

 

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

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

Рассмотрим текст файла заголовка CountArray2.h для класса СCountArray2. За исключением нового имени класса и объекта мьютекс, этот файл идентичен предыдущей версии файла CountArray.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() завершит свою работу, объект выйдет из области видимости, что приведет к вызову его деструктора, который автоматически освободит объект.


18.01.2020; 22:52
хиты: 51
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь