multithreading c with examples
Короткий вступ до багатопоточності на C ++.
У цьому посібнику ми отримаємо огляд багатопоточності в C ++.
Отже, що таке нитка? Нитка - це робоча одиниця певного процесу. У операційних системах, що програмують багато програм, різні процеси виконуються одночасно.
Подібним чином ми можемо захотіти виконувати ті самі екземпляри процесу одночасно. Кожному екземпляру процесу, у цьому випадку, присвоюється блок виконання, який називається потоком. У багатопотоковій системі численні потоки виконуються одночасно незалежно один від одного.
=> Погляньте на посібник для початківців C ++ тут.
як створити підроблений електронний лист -
До C ++ 11 ми мали підтримку потоків POSIX. Але ця функція мала серйозні проблеми з портативністю, оскільки вона працювала лише в операційній системі Linux або UNIX. Таким чином, починаючи з С ++ 11, ми маємо єдиний клас std :: thread який визначає всю функціональність потоків. Класи та функції визначені у файлі заголовка.
Що ви дізнаєтесь:
Робота з
За допомогою std :: thread нам просто потрібно створити новий об’єкт потоку та передати йому виклик. Викликаний - це виконуваний код, який ми хочемо виконати, коли потік запущений. Отже, коли нам потрібен новий потік, ми просто створюємо об’єкт std :: thread і передаємо викликається як аргумент своєму конструктору.
Після створення об’єкта std :: thread запускається новий потік і виконується код, наданий callable.
Давайте подивимося, як ми можемо визначити виклик, який повинен бути наданий об’єкту потоку.
Викликається можна визначити трьома способами.
# 1) Використання об’єкта функції
Ми можемо використовувати об’єкт функції як виклик у об’єкті потоку. Для використання об'єкта функції нам потрібно мати клас, і в цьому класі ми перевантажуємо оператор (). Ця перевантажена функція містить код, який буде виконаний при створенні потоку.
/ / Define the class for function object class functioObject_class { // Overload () operator void operator()(params) { // code to be executed } }; // Create thread object
std::thread thread_object(functioObject_class (), params)
Зверніть увагу на те, як визначається об’єкт потоку. Як перший параметр конструктора потокового об'єкта, ми надаємо перевантажену функцію, а потім вказуємо її аргументи (параметри) як другий аргумент.
# 2) Використання покажчика функцій
Викликаний за допомогою покажчика функції можна визначити наступним чином.
void funct_call(params) //code to be executed }
Після того, як ми визначимо цю функцію, ми можемо створити об’єкт потоку з цією функцією як викликається наступним чином.
std::thread thread_obj(funct_call, params);
Зверніть увагу, що аргументи (параметри), передані функції, надаються після імені функції в об'єкті потоку.
# 3) Використання лямбда-виразу
Ми також можемо мати виклик як лямбда-вираз і передавати його об’єкту потоку для виконання. Фрагмент коду для того самого показано нижче.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
У наведеному вище коді ми визначили лямбда-вираз f, а потім передаємо його конструктору об’єкта потоку як перший аргумент, а потім його параметри (параметри) як другий аргумент.
std::thread join method
У деяких випадках ми можемо хотіти, щоб поточний виконуваний потік закінчився, перш ніж розпочати іншу дію.
Класичний приклад - це коли ми відкриваємо програму GUI. У той момент, коли ми відкриваємо програму, запускається потік для завантаження та ініціалізації графічного інтерфейсу, і ми не можемо виконати жодних дій, якщо завантаження та ініціалізація не виконані правильно, щоб забезпечити належну роботу графічного інтерфейсу.
Запити sql беруть інтерв’ю на запитання та відповіді для нових
Клас std :: thread передбачає метод join (), який гарантує, що поточний потік (вказаний * this) закінчується першим перед виконанням будь-яких інших дій.
Візьмемо такий приклад,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
У наведеному вище прикладі основна функція повинна буде зачекати, щоб продовжити, поки потік t1 не закінчиться. Загалом, функція з’єднання потоку блокує інші дії / функціональність, поки виклик потоку не закінчить своє виконання.
Приклад нитки
Ми представляємо повний приклад кодування для створення та виконання потоку в програмі, показаній нижче.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Вихід:
Потік 1 :: callable => покажчик функції
Потік 1 :: callable => покажчик функції
Тема 3 :: callable => лямбда-вираз
Тема 3 :: callable => лямбда-вираз
Потік 2 :: callable => об'єкт функції
Потік 2 :: callable => об'єкт функції
У наведеному вище прикладі ми створили три потоки, використовуючи три різні викликаються функції, тобто покажчик функції, об’єкт та лямбда-вираз. Ми створюємо 2 екземпляри кожного потоку і запускаємо їх. Як показано на виході, три потоки працюють одночасно незалежно один від одного.
Рекомендована література = >> Посібник з тестування ниток
Висновок
У цьому посібнику ми побачили багатопотокові концепції на C ++ на наочному прикладі. У наступних підручниках ми дізнаємось більше тем на C ++, які допоможуть нам писати надійні та ефективні програми.
=> Прочитайте серію навчальних програм Easy C ++.
Рекомендована література
- Підручник з основних функцій Python з практичними прикладами
- Підручник з Python DateTime із прикладами
- Вирізати команду в Unix з прикладами
- Синтаксис команд Unix Cat, варіанти з прикладами
- Використання курсору в MongoDB з прикладами
- Команда Ls в Unix з прикладами
- Метод сортування MongoDB () із прикладами
- Команда Grep в Unix на простих прикладах