- •Начало
- •Использование многопоточности
- •Проблемы многопоточности
- •Реентрабельность
- •Локальное хранилище потока
- •Поддержка многопоточности в C ++
- •Библиотеки многопоточности
- •Потоки
- •Мьютексы
- •Блокировки
- •Условные переменные, барьеры
- •Способы обеспечения безопасности потоков
- •Синхронизация на уровне объектов
- •Синхронизация в стандартной библиотеке
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование библиотеки условных переменных
Пример (Boost)
#include <boost/thread/condition_variable.hpp>
using namespace boost;
Пример (C++0x)
#include <condition_variable>
using namespace std;
Лекция 8 |
46 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Методы condition_variable[_any]
Методы (владение, освобождение)
native_handle_type native_handle();
void notify_one();
void notify_all();
Лекция 8 |
47 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Методы condition_variable (окончание)
Ожидание
void wait(unique_lock <mutex> &);
template <class Predicate>
void wait(unique_lock <mutex> &, Predicate pred);
bool timed_wait(
unique_lock <mutex> &, system_time const &rcAbsTime); (Boost)
template <typename DurationType> bool timed_wait(
unique_lock <mutex> &, DurationType const &rcRelTime); (Boost)
timed_wait() с предикатом (Boost)
wait_for(), wait_until() без/с предикатом (C++0x)
Лекция 8 |
48 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Методы condition_variable_any (окончание)
Ожидание
template <class Lock> void wait(Lock &);
template <class Lock, class Predicate> void wait(Lock &, Predicate pred);
template <class Lock> bool timed_wait(
Lock &, system_time const &rcAbsTime); (Boost)
template <class Lock, typename DurationType> bool timed_wait(
Lock &, DurationType const &rcRelTime); (Boost)
timed_wait() с предикатом (Boost)
wait_for(), wait_until() без/с предикатом (C++0x)
Лекция 8 |
49 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Использование условных переменных
Пример
condition_variable g_Cond; mutex g_Mtx;
bool g_bDataReady; void process_data();
void wait_for_data_to_process()
{
unique_lock <mutex> l(g_Mtx); while (!g_bDataReady)
g_Cond.wait(l); process_data();
}
Пример (окончание)
void retrieve_and_process_data();
void prepare_data_for_processing()
{
retrieve_and_process_data();
{
lock_guard <mutex> l(g_Mtx); g_bDataReady = true;
}
g_Cond.notify_one();
}
Лекция 8 |
50 / 55 |
Начало |
Потоки |
Использование многопоточности |
Мьютексы |
Библиотеки многопоточности |
Блокировки |
Способы обеспечения безопасности потоков |
Условные переменные, барьеры |
Определение boost::barrier
Boost
// #include <boost/thread/barrier.hpp>
class barrier
{
public:
barrier(unsigned int uCount); ~barrier();
bool wait();
};
Лекция 8 |
51 / 55 |