- •Начало
- •Использование многопоточности
- •Проблемы многопоточности
- •Реентрабельность
- •Локальное хранилище потока
- •Поддержка многопоточности в C ++
- •Библиотеки многопоточности
- •Потоки
- •Мьютексы
- •Блокировки
- •Условные переменные, барьеры
- •Способы обеспечения безопасности потоков
- •Синхронизация на уровне объектов
- •Синхронизация в стандартной библиотеке
Начало |
|
Использование многопоточности |
Синхронизация на уровне объектов |
Библиотеки многопоточности |
Синхронизация в стандартной библиотеке |
Способы обеспечения безопасности потоков |
|
Автоматическая синхронизация
Пример
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 |