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

Начало

Потоки

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

Мьютексы

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

Блокировки

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

Условные переменные, барьеры

Использование библиотеки мьютексов

Пример (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