- •Начало
- •Использование многопоточности
- •Проблемы многопоточности
- •Реентрабельность
- •Локальное хранилище потока
- •Поддержка многопоточности в C ++
- •Библиотеки многопоточности
- •Потоки
- •Мьютексы
- •Блокировки
- •Условные переменные, барьеры
- •Способы обеспечения безопасности потоков
- •Синхронизация на уровне объектов
- •Синхронизация в стандартной библиотеке
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Локальное хранилище потока
Определение
Локальное хранилище потока: (Thread-local storage, TLS) набор статических/глобальных переменных, локальных по отношению к использующему их потоку.
Лекция 8 |
5 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Точка последовательности
Пример
int main()
{
int i = 0; cout
<<(i += 1) << ’ ’
<<(i += 1) << ’ ’
<<(i += 1) << endl;
}
Лекция 8 |
6 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Точка последовательности
Пример
int main()
{
int i = 0;
cout.operator << (i += 1).operator << (i += 1).operator << (i += 1);
}
Лекция 8 |
6 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Точка последовательности
Пример
int main()
{
int i = 0;
x.f1(++ i).f2(++ i).f3(++ i);
}
Лекция 8 |
6 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Точка последовательности
Пример
int main()
{
int i = 0;
// x.f1(++ i).f2(++ i).f3(++ i); f3(f2(f1(x, ++ i), ++ i), ++ i);
}
Лекция 8 |
6 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Точка последовательности (продолжение)
Определение (C++98, C++03)
Точка последовательности: (Sequence Point) место программы, в котором все побочные эффекты от предыдущих вычислений должны завершиться, а от последующих ещё не начаться.
Лекция 8 |
7 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Точка последовательности (окончание)
Точки последовательности
Окончание вычисления полного выражения;
После завершения вычисления аргументов функции до начала выполнения её тела.
После копирования возвращаемого значения функции до вычисления любых выражений вне её.
После вычисления первого выражения в:
expr1 && expr2 expr1 || expr2 expr1, expr2
expr1 ? expr2 : expr3
Лекция 8 |
8 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Многопоточность в C++0x
Изменения
В модель исполнения программы добавлено понятие многопоточности.
Условия гонок за данными отмечены как приводящие к неопределённому поведению программы.
Определение точек последовательности (Sequence Points) заменено на отношение предшествования вычисления (Sequenced before).
Добавлен класс хранения thread_local с возможностью динамической инициализации.
Лекция 8 |
9 / 55 |
Начало |
Проблемы многопоточности |
Использование многопоточности |
Реентрабельность |
Библиотеки многопоточности |
Локальное хранилище потока |
Способы обеспечения безопасности потоков |
Поддержка многопоточности в C ++ |
Использование библиотеки потоков
Пример
thread_local int gt_n = 0;
void thread_func()
{
static thread_local int st_n = ++ gt_n;
// . . .
}
Лекция 8 |
10 / 55 |