Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПИ_ИКТ Программирование по С++ (1 семестр) _Хотов.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
5.83 Mб
Скачать

Инициализация параметров

Есть ещё классная штука - возможность инициализировать параметры, запустив функцию однократно. Например, есть три потока, которые обращаются к переменной х, но сперва её надо инициализировать, причём только один раз, а не всеми тремя потоками сразу. Для этого предусмотрен специальный механизм:

int i;

boost::once_flag flag = BOOST_ONCE_FLAG;

void init()

{

i = 0;

}

void thread()

{

boost::call_once(&init, flag);

// дальнейший код

}

Так вот, инициализация произойдёт всего один раз, независимо от числа конкурирующих потоков.

Ожидание внутри потоков

Иногда надо подождать немного в потоке. Для этого есть два разных способа

  • boost::this_thread::sleep(params)

  • boost::this_thread::yield()

Первый (с установленными параметрами) замораживает поток на указанное время.

Второй действует хитрее - он ненадолго замораживает поток, отдавая тем самым ресурсы другим участникам состязания за них. Эдакая джентльменская уступка.

Лабораторная работа № 32. BOOST::THREADS. Многопоточное программирование

Цель работы:

Овладеть навыками использования многопоточного программирования с использованием библиотеки BOOST.

Порядок выполнения работы

Решить задачи из [Лабораторной работы № 23. Семафоры: защита критических секций, условная синхронизация] с использованием библиотеки BOOST соответственно своему варианту.

    1. BOOST::REGEX - РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ

Введение

Boost.Regex является собираемой библиотекой, т.е для ее использования необходимо ее собрать. Как это сделать написано в Getting started. Собирая библиотек вы можете выбрать один из двух алгоритмов, которые будет использоваться в движке регулярных выражений: рекурсивный и не-рекурсивный. Первый быстрый, но может грозить переполнением стека, второй немного медленней, но безопасный. Макросы для определения разных способов BOOST_REGEX_RECURSIVE и BOOST_REGEX_NON_RECURSIVE соответственно. Макросы для настройки алгоритмов и их описание можно посмотреть Здесь

Основные алгоритмы

boost::regex_match

Данный алгоритм используется для проверки соответсвия входящей строки и некоторого регулярного выражения, возвращая true Если строка соответсвует и false в другом случае. Типичный способ использования: regex_match(входящая_строка, [результаты_нахождения_соответствий], регулярное_выражение, [флаги]). Полный список всех перегруженных объявлений смотри в документации. Пример его использования:

std::string xStr("AAAA-12222-BBBBB-44455");

boost::regex xRegEx("(\\w+)-(\\d+)-(\\w+)-(\\d+)");

boost::smatch xResults;

std::cout << "================Results==================== \n";

std::cout << "Does this line match our needs? " << std::boolalpha << boost::regex_match(xStr, xResults, xRegEx) << "\n";

std::cout << "Print entire match:\n " << xResults[0] << std::endl;

std::cout << "Print the former string into another format:\n" << xResults[1] << "+" << xResults[2] << "+" << xResults[3] << "+" << xResults[4] << std::endl; * This source code was highlighted with Source Code Highlighter.

Результатом работы будет:

===================Results===========================

Does this line match our needs? true

Print entire match: AAAA-12222-BBBBB-44455

Print the former string into another format: AAAA+12222+BBBBB+44455