Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Потоковая безопасность (презентация).pdf
Скачиваний:
20
Добавлен:
28.06.2014
Размер:
697.48 Кб
Скачать

Начало

 

Использование многопоточности

Синхронизация на уровне объектов

Библиотеки многопоточности

Синхронизация в стандартной библиотеке

Способы обеспечения безопасности потоков

 

Автоматическая синхронизация

Пример

template <class T, class G> class GuardedT

{

 

private:

 

T &m_rT;

// охраняемый объект

G &m_rG;

// мьютекс

public:

 

class GL

 

{

 

private: T &m_rT; G &m_rG;

Пример (окончание)

GL &operator = (const GL &); friend class GuardedT <T, G>; GL(T &rT, G &rG)

: m_rT(rT), m_rG(rG)

{m_rG.lock(); } public:

~GL() { m_rG.unlock(); } T *operator -> ()

{return &m_rT; }

T &operator * () { return m_rT; }

}; // GuardedT <T, G>::GL

Лекция 8

52 / 55

Начало

 

Использование многопоточности

Синхронизация на уровне объектов

Библиотеки многопоточности

Синхронизация в стандартной библиотеке

Способы обеспечения безопасности потоков

 

Автоматическая синхронизация (продолжение)

Пример (окончание)

GL operator -> () { return GL(m_rT, m_rG); } GL operator * () { return GL(m_rT, m_rG); }

// . . .

}; // template <class T, class G> class GuardedT

Лекция 8

53 / 55

Начало

 

Использование многопоточности

Синхронизация на уровне объектов

Библиотеки многопоточности

Синхронизация в стандартной библиотеке

Способы обеспечения безопасности потоков

 

Автоматическая синхронизация (продолжение)

Пример (использование GuardedT)

int main()

{

typedef GuardedT <vector <int>, mutex> IntVector; IntVector v(new vector <int> (), new mutex()); v->push_back(1);

// . . .

}

Лекция 8

54 / 55

Начало

 

Использование многопоточности

Синхронизация на уровне объектов

Библиотеки многопоточности

Синхронизация в стандартной библиотеке

Способы обеспечения безопасности потоков

 

Автоматическая синхронизация (окончание)

Пример

void Collection::add(const Data &rcData)

{

m_Vector.push_back(rcData); std::sort(m_Vector.begin(), m_Vector.end());

}

Лекция 8

55 / 55