- •Начало
- •Использование многопоточности
- •Проблемы многопоточности
- •Реентрабельность
- •Локальное хранилище потока
- •Поддержка многопоточности в C ++
- •Библиотеки многопоточности
- •Потоки
- •Мьютексы
- •Блокировки
- •Условные переменные, барьеры
- •Способы обеспечения безопасности потоков
- •Синхронизация на уровне объектов
- •Синхронизация в стандартной библиотеке
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование библиотеки мьютексов
Пример (Boost)
#include <boost/thread/mutex.hpp>
using namespace boost;
Пример (C++0x)
#include <mutex>
using namespace std;
Лекция 8 |
28 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Классы mutex и recursive_mutex
Методы (владение, блокировка)
native_handle_type native_handle();
void lock();
bool try_lock();
void unlock();
Лекция 8 |
29 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Классы timed_mutex и recursive_timed_mutex
Методы (владение, блокировка)
native_handle_type native_handle();
void lock(); bool try_lock(); void unlock();
bool timed_lock(system_time const &rcAbsTime); (Boost)
template <typename TimeDuration>
bool timed_lock(TimeDuration const &rcRelTime); (Boost)
template <class Rep, class Period> bool try_lock_for(
const chrono::duration <Rep, Period> &rcRelTime); (C++0x)
template <class Clock, class Duration> bool try_lock_until(
const chrono::time_point <Clock, Duration> &rcAbsTime); (C++0x)
Лекция 8 |
30 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование библиотеки блокировок
Пример (Boost)
#include <boost/thread/locks.hpp>
using namespace boost;
Пример (C++0x)
#include <mutex>
using namespace std;
Лекция 8 |
31 / 55 |
Начало |
Потоки |
|
|
|
|
|||
Использование многопоточности |
Мьютексы |
|
|
|
|
|||
Библиотеки многопоточности |
Блокировки |
|
|
|
|
|||
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
|
|
|
|
|||
Определение lock_guard |
|
|
|
|
|
|
|
|
C++0x |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <class Mutex> class lock_guard |
|
|
|
|
||||
{ |
|
|
|
|
|
|
|
|
public: |
|
|
|
|
|
|
|
|
typedef Mutex mutex_type; |
|
|
|
|
|
|
|
|
explicit lock_guard(mutex_type &); |
|
|
|
|
|
|
|
|
lock_guard(mutex_type &, adopt_lock_t); |
|
|
|
|
||||
~lock_guard(); |
|
|
|
|
|
|
|
|
lock_guard(lock_guard const &) = delete; |
// C++0x |
|
||||||
lock_guard &operator = (lock_guard const &) = delete; |
// C++0x |
|
||||||
private: |
|
|
|
|
|
|
|
|
mutex_type &r_Mutex; |
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Лекция 8 |
32 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование блокировок
Пример |
|
Пример (окончание) |
|
||
class Collection |
|
void Collection::add_value( |
{ |
|
const Data &rcData) |
// . . . |
|
{ |
private: |
|
lock_guard <mutex> lock(m_Mutex); |
MyVector m_Vector; |
|
m_Vector.push_back(rcData); |
mutex m_Mutex; |
|
} |
}; |
|
|
|
|
|
Лекция 8 |
33 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Общие алгоритмы блокировки
Алгоритмы
template <class L1, class L2, class ... L3> int try_lock(L1 &, L2 &, L3 & ...);
(-1, 0, 1, . . . ) (C++0x)
template <class L1, class L2, class ... L3> void lock(L1 &, L2 &, L3 & ...); (C++0x)
Лекция 8 |
34 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование нескольких блокировок
Пример (блокировка двух объектов)
bool operator < (const X &rcX1, const X &rcX2)
{
if (&rcX1 == &rcX2) return false;
//
lock_guard <mutex> lock1(rcX1.m_Mutex); lock_guard <mutex> lock2(rcX2.m_Mutex);
//
return some_compare(rcX1, rcX2);
}
Лекция 8 |
35 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование нескольких блокировок
Пример (блокировка двух объектов)
bool operator < (const X &rcX1, const X &rcX2)
{
if (&rcX1 == &rcX2) return false;
//
lock(rcX1.m_Mutex, rcX2.m_Mutex);
lock_guard <mutex> lock1(rcX1.m_Mutex, adopt_lock); lock_guard <mutex> lock2(rcX2.m_Mutex, adopt_lock);
//
return some_compare(rcX1, rcX2);
}
Лекция 8 |
35 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Класс unique_lock
Методы (создание)
unique_lock();
explicit unique_lock(mutex_type &);
unique_lock(mutex_type &, adopt_lock_t);
unique_lock(mutex_type &, defer_lock_t);
unique_lock(mutex_type &, try_to_lock_t);
Лекция 8 |
36 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование нескольких блокировок (unique_lock)
Пример (блокировка двух объектов)
bool operator < (const X &rcX1, const X &rcX2)
{
if (&rcX1 == &rcX2) return false;
//
unique_lock <mutex> lock1(rcX1.m_Mutex, defer_lock); unique_lock <mutex> lock2(rcX2.m_Mutex, defer_lock); lock(rcX1.m_Mutex, rcX2.m_Mutex);
//
return some_compare(rcX1, rcX2);
}
Лекция 8 |
37 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Класс unique_lock (продолжение)
Методы (создание, перемещение)
unique_lock(mutex_type &, system_time const &); (Boost)
template <class Rep, class Period> unique_lock(
mutex_type &, const chrono::duration <Rep, Period> &); (C++0x)
template <class Clock, class Duration> unique_lock(
mutex_type &, const chrono::time_point <Clock, Duration> &);
(C++0x)
Семантика перемещения
Лекция 8 |
38 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Класс unique_lock (продолжение)
Методы (блокировка)
void lock();
bool try_lock();
void unlock();
bool timed_lock(system_time const &rcAbsTime); (Boost)
template <typename TimeDuration>
bool timed_lock(TimeDuration const &rcRelTime); (Boost)
template <class Rep, class Period> bool try_lock_for(
const chrono::duration <Rep, Period> &rcRelTime); (C++0x)
template <class Clock, class Duration> bool try_lock_until(
const chrono::time_point <Clock, Duration> &rcAbsTime); (C++0x)
Лекция 8 |
39 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Класс unique_lock (окончание)
Методы (проверка состояния, освобождение)
bool owns_lock() const;
operator unspecified_bool_type() const; (Boost)
bool operator ! () const; (Boost)
explicit operator bool () const; (C++0x)
mutex_type *mutex() const;
mutex_type *release();
Лекция 8 |
40 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Класс boost::shared_mutex
Методы (разделяемая блокировка)
Все методы boost::mutex
void lock_shared();
bool try_lock_shared();
bool timed_lock_shared(system_time const &);
void unlock_shared();
void lock_upgrade();
void unlock_upgrade();
void unlock_upgrade_and_lock();
void unlock_and_lock_upgrade();
void unlock_and_lock_shared();
void unlock_upgrade_and_lock_shared();
Лекция 8 |
41 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Класс boost::shared_lock
Методы (разделяемая блокировка)
Все методы boost::unique_lock
void lock(); (вызывает m_pMutex->lock_shared();)
и т. д.
Лекция 8 |
42 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Реализация совместного чтения
Пример
void Storage::read(Data &rData)
{
shared_lock <shared_mutex> lock(m_Mutex);
// . . .
}
void Storage::write(const Data &rcData)
{
lock_guard <shared_mutex> lock(m_Mutex);
// . . .
}
Лекция 8 |
43 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Другие классы блокировок (Boost)
Классы блокировок
upgrade_lock (методы lock(), unlock(), owns_lock(), к bool)
upgrade_to_unique_lock (методы owns_lock(), к bool)
Инициализация/присваивание
upgrade_lock ! upgrade_to_unique_lock
Лекция 8 |
44 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Другие классы блокировок (Boost)
Классы блокировок
upgrade_lock (методы lock(), unlock(), owns_lock(), к bool)
upgrade_to_unique_lock (методы owns_lock(), к bool)
Инициализация/присваивание
upgrade_lock ! upgrade_to_unique_lock
Лекция 8 |
44 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Реализация чтения и записи
Пример
void Storage::update_and_write(/ . . . /)
{
upgrade_lock <shared_mutex> lock1(m_Mutex);
// . . .
{
upgrade_to_unique_lock <shared_mutex> lock2(lock1);
// . . .
}
// . . .
}
Лекция 8 |
45 / 55 |