06. Семафоры
Семафоры В C++20 в стандартной библиотеке появились семафоры. Семафоры в языке C++ напрямую не используются, чаще они используются в классическом C для обработки событий и проверки занятости ресурсов. В языке C++ для разграничения доступа к общим ресурсам используются мьютексы и очереди, что весьма эффективно. Двоичный семафор в чем-то похож на мьютекс, он показывает свободен ли […]
05. Queue. Очереди
Queue. Очереди Очереди в языке C++ можно создать различными способами, чаще всего используются deque и списки (list), но физически очередь можно создать на основе почти любого контейнера или написать самостоятельно, также может использоваться адаптер queue. Конечно deque немного противоречит логике очередей (добавление элементов в начало очереди, но для обработки критических данных это бывает полезно). Также […]
04. Mutex. Синхронизация потоков.
Mutex. Синхронизация потоков. Как было наглядно видно в теме 00 – при работе с потоками они могут обращаться к ресурсам в асинхронном режиме, что приводит к некоторым ошибкам (например некорректный вывод данных в консоль) при работе нескольких потоков одновременно. Для борьбы с этой проблеммой применяют методы синхронизации потоков (некоторая часть “переехала” из чистого C и […]
С++ Оценка времени выполнения кода
Оценка времени выполнения кода Весьма полезно иметь возможность оценить время выполнения какого-то фрагмента кода или потока чтобы выполнить оптимизацию. Для этого необходима библиотека #include «chrono» или #include «thread», которая уже включает библиотеку chrono. Суть измерения – запоминаем «системное» время в начале кода и по его окончанию и высчитываем разницу. За работу со временем отвечает библиотека […]
03. Методы классов в потоке
Методы классов в потоке Передача методов класса в поток принципиально не отличается от передачи функций Для начала создадим класс, содержащий 3 метода (различия в принимаемых и возвращаемых значениях) class ClassForTest { public: ClassForTest(){} ~ClassForTest(){} void NoRet_NoArg() { cout<<«Task ID=»<<this_thread::get_id()<<endl; for (int var = 0; var < 5; ++var) { cout<<«Task is in progress #»<<var<<endl; this_thread::sleep_for(chrono::milliseconds(100)); […]
02. Потоки и функции с return, возврат результата выполнения потока
Потоки и функции с return Лямбда выражения и возврат результата выполнения потока Иногда необходимо в поток передать функцию, возвращающую какое-то значение, для этого удобно использовать лямбда-функции и в них получать возвращаемое значение, например: int Sum(int a, int b) { return (a+b); } int main() { Sleep(2000); int result=0; thread Task1([&result]() {result=Sum(3,2); }); Task1.join(); cout<<result<<endl; return […]
01. Передача параметра в поток по ссылке или указателю
Передача параметра в поток по ссылке или указателю По умолчанию потоки НЕ работают со ссылками, они используют переменные по значению, что в общем-то логично, т.к. при многопоточности работать с памятью напрямую может быть небезопасно (обращения к одной переменной из разных потоков одновременно), но передать параметр в поток по ссылке можно. Чтобы передать параметр в поток […]
00. Многопоточность. Потоки / threads.
Многопоточность. Потоки / threads. Одной из ключевых особенностей в современных языках программирования – является использование многопоточного режима выполнения программы, отчасти это стало возможным благодаря технологии “Hyper-Threading” от компании Intel, появлению многоядерных и многооточных вычислительных систем и в целом больших возможностей у современных вычислителей, когда ядро процессора какое-то время «не занято» Что из себя представляет многопоточность? […]
44. C++ Анонимные функции. Лямбда функции
Анонимные функции. Лямбда функции В языке C++ есть возможность создавать анонимные функции или же лямбда функции, т.е. функции без имени. Зачем это надо? Иногда для какого-либо теста или однократного выполнения какой-то операции не требуется создавать «глобальную» функцию, которая может использоваться многократно в документе. Также одним из преимуществ лямбда-функций является «управление зоной видимости» мы можем сами […]