Багатопотоковість — це функція, яка дозволяє одночасне виконання двох або більше частин програми для максимального використання ЦП. Кожна частина такої програми називається потоком. Отже, потоки — це легкі процеси в процесі.
supw
Підтримка багатопоточності була введена в C++11. До C++11 нам доводилося використовувати Потоки або бібліотека POSIX . Хоча ця бібліотека справлялася зі своєю роботою, відсутність будь-якого стандартного набору мовних функцій спричинила серйозні проблеми з переносимістю. C++ 11 покінчив із усім цим і дав нам std::thread . Класи потоків і відповідні функції визначені в файл заголовка.
Синтаксис:
std::thread thread_object (callable);>
std::thread це клас потоку, який представляє один потік у C++. Щоб запустити потік, нам просто потрібно створити новий об’єкт потоку та передати код виконання, який потрібно викликати (тобто об’єкт, що викликається), у конструктор об’єкта. Після створення об’єкта запускається новий потік, який виконає код, указаний у callable. Об’єкт виклику може бути будь-яким із п’яти:
- Покажчик на функцію
- Лямбда-вираз
- Функціональний об’єкт
- Нестатична функція-член
- Статична функція-член
Після визначення викликаного ми передаємо його конструктору.
Запуск потоку за допомогою покажчика функції
Покажчик на функцію може бути викликаним об’єктом для передачі в конструктор std::thread для ініціалізації потоку. Наступний фрагмент коду демонструє, як це робиться.
приклад:
C++
void> foo(param)> {> >Statements;> }> // The parameters to the function are put after the comma> std::>thread> thread_obj(foo, params);> |
>
>
Запуск потоку за допомогою лямбда-виразу
Об’єкт std::thread можна також запустити за допомогою лямбда-виразу як викликаного. Наступний фрагмент коду демонструє, як це робиться:
приклад:
C++
// Define a lambda expression> auto> f = [](params)> {> >Statements;> };> // Pass f and its parameters to thread> // object constructor as> std::>thread> thread_object(f, params);> |
>
>
Запуск потоку за допомогою функціональних об’єктів
Функціональні об’єкти або функтори також можна використовувати для запуску потоку в C++. Наступний фрагмент коду демонструє, як це робиться:
приклад:
C++
зразок javascript
// Define the class of function object> class> fn_object_class {> >// Overload () operator> >void> operator()(params)> >{> >Statements;> >}> }> // Create thread object> std::>thread> thread_object(fn_object_class(), params)> |
>
>
Примітка : ми завжди передаємо параметри викликаного окремо як аргументи конструктору потоку.
Запуск потоку з використанням функції нестатичного члена
Ми також можемо запустити потік за допомогою нестатичної функції-члена класу. Наступний фрагмент демонструє, як це зробити.
C++
// defining clasc> class> Base {> public>:> >// non-static member function> >void> foo(param) { Statements; }> }> // object of Base Class> Base b;> // first parameter is the reference to the functionn> // and second paramter is reference of the object> // at last we have arguments> std::>thread> thread_obj(&Base::foo, &b, params);> |
перевести рядок як int java
>
>
Запуск потоку за допомогою статичної функції члена
Ми також можемо запускати потоки за допомогою статичних функцій-членів.
C++
// defining class> class> Base {> public>:> >// static member function> >static> void> foo(param) { Statements; }> }> // object of Base Class> Base b;> // first parameter is the reference to the function> // and rest are arguments> std::>thread> thread_obj(&Base::foo, params);> |
>
pvr повна форма
>
Очікування завершення потоків
Коли потік розпочато, нам може знадобитися дочекатися його завершення, перш ніж ми зможемо вжити певних дій. Наприклад, якщо ми виділяємо завдання ініціалізації графічного інтерфейсу програми для потоку, нам потрібно дочекатися завершення потоку, щоб переконатися, що графічний інтерфейс завантажується належним чином.
Щоб дочекатися потоку, використовуйте std::thread::join() функція. Ця функція змушує поточний потік очікувати, поки потік, ідентифікований * це завершив виконання.
Наприклад, щоб заблокувати основний потік до завершення потоку t1, ми б зробили:
C++
int> main()> {> >// Start thread t1> >std::>thread> t1(callable);> >// Wait for t1 to finish> >t1.join();> >// t1 has finished do other stuff> >Statements;> }> |
>
>
Повна програма C++ для багатопоточності
Нижче наведено програму C++. Він запускає три потоки з основної функції. Кожен потік викликається за допомогою одного з викликаних об'єктів, указаних вище.
C++
рядки java
// C++ program to demonstrate> // multithreading using three> // different callables.> #include> #include> using> namespace> std;> // A dummy function> void> foo(>int> Z)> {> >for> (>int> i = 0; i cout << 'Thread using function' ' pointer as callable
'; } } // A callable object class thread_obj { public: void operator()(int x) { for (int i = 0; i cout << 'Thread using function' ' object as callable
'; } }; // class definition class Base { public: // non-static member function void foo() { cout << 'Thread using non-static member function ' 'as callable' << endl; } // static member function static void foo1() { cout << 'Thread using static member function as ' 'callable' << endl; } }; // Driver code int main() { cout << 'Threads 1 and 2 and 3 ' 'operating independently' << endl; // This thread is launched by using // function pointer as callable thread th1(foo, 3); // This thread is launched by using // function object as callable thread th2(thread_obj(), 3); // Define a Lambda Expression auto f = [](int x) { for (int i = 0; i cout << 'Thread using lambda' ' expression as callable
'; }; // This thread is launched by using // lambda expression as callable thread th3(f, 3); // object of Base Class Base b; thread th4(&Base::foo, &b); thread th5(&Base::foo1); // Wait for the threads to finish // Wait for thread t1 to finish th1.join(); // Wait for thread t2 to finish th2.join(); // Wait for thread t3 to finish th3.join(); // Wait for thread t4 to finish th4.join(); // Wait for thread t5 to finish th5.join(); return 0; }> |
>
>
Вихід (залежно від машини)
Threads 1 and 2 and 3 operating independently Thread using function pointer as callable Thread using function pointer as callable Thread using function pointer as callable Thread using non-static member function as callable Thread using function object as callable Thread using function object as callable Thread using function object as callable Thread using lambda expression as callable Thread using lambda expression as callable Thread using lambda expression as callable Thread using static member function as callable>
Примітка: Для компіляції програм із підтримкою std::thread використовуйте g++ -std=c++11 -pthread.