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

Начало

Проблемы многопоточности

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

Реентрабельность

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

Локальное хранилище потока

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

Поддержка многопоточности в 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