Uživatel:Jkl~cswikiversity/Studuji cpp/boost/thread
Boost.Thread - úvod
[editovat]Tuto knihovnu původně navrhl William E. Kempf. Knihovna slouží k multiplatformnímu vícevláknovému programování. Základní stránka projektu je [1] či novější - podle verze boostu. Boost.Thread byl celkem zásadně překopán mezi verzemi 1.34 a 1.35. V době psaní této stránky (t.j. 1.37) se zdá být již (snad) stabilizován a tak budou snad následující řádky platit i pro další verze boostu a bohdá i pro budoucí normu C++ ... Každopádně, nebude-li uvedeno jinak, tak byl kód testován v Boostu 1.35, který se mi podařilo ulovit z repozitářů (viz výše).
Užití
[editovat]Knihovna Thread se linkuje takto:
#include <boost/thread.hpp>
.
Pokud jste boost vařili sami, tak nezapomeňte na nastavení cesty
g++ -I path/to/boost_1_37_0 example.cpp -o example
Pokud používáte boost předvařený, stačí příkaz uvedený v následující ukázce.
První ukázka práce s vlákny
[editovat]Každá instance třídy boost:thread reprezentuje vlákno či ne-vlákno. [2] Nejjednodušší ukázka thread01.cpp
#include <boost/thread/thread.hpp> // toto musíme naincludovat pro thread
#include <iostream> // bežná knihovna pro výstup
#include <unistd.h> // kvůli funkci sleep()
using namespace std; // abychom nemuseli opisovat pořád std::
void hello_world() // funkce, která poběží v paralelním vláknu
{
cout << "Hello world, I'm a thread!" << endl;
}
void tecky() // funkce, která poběží v paralelním vláknu a vypisuje tečky
{
for(int i=0;i<61;++i) {cout<<"."<<flush; sleep(1);} // každou vteřinu napíšeme tečku
}
void carky() // funkce, která poběží v paralelním vláknu a vypisuje čárky
{
for(int i=0;i<31;++i) {cout<<","<<flush; sleep(2);} // každé 2 vteřiny napíšeme čárku
}
int main(int argc, char* argv[]) // tělo
{
cout<<"Hi, I am main !"<<endl; // Ohlásíme, že jsme stále v hlavním vlákně
boost::thread my_thread(&hello_world); //spustíme funkci hello_world v samostatném vlákně
boost::thread my_thread1(&tecky); //spustíme funkci tecky v samostatném vlákně
boost::thread my_thread2(&carky); //spustíme funkci carky v samostatném vlákně
for(int i=0;i<10;++i) {cout<<"-"<<flush; sleep(5);} // Každých 5s vypíšeme pomlčku
my_thread.join(); // čekáme dokud vlákno neskončí
my_thread1.join(); // čekáme dokud vlákno neskončí
my_thread2.join(); // čekáme dokud vlákno neskončí
cout<<endl<<"Hi, I am main !"; // a zase zahlásíme, že jsme doma
return 0; // int main má vracet hodnotu, pro forma ...
}
Kompilace:
g++ thread01.cpp -lboost_thread -o thread01;./thread01
Výstup programu:
Hi, I am main ! Hello world, I'm a thread! .,-.,..,.-.,..,..-,..,..,.-.,..,..-,..,..,.-.,..,..-,..,..,.-.,..,..-,..,..,.-.,..,..,..,..,..,..,..,. Hi, I am main !
Inspirace: wikipedie
Zamotáme to Mutexem
[editovat]Je úžasné, že máme program, který běží ve čtyřech vláknech najednou a něco píše na obrazovku. To je opravdu jednoduché. Pokud ale budeme chtít, aby podprogramy dělaly něco užitečného, velmi záhy narazíme na to, že si potřebujeme předat nějaké proměnné. K tomu slouží zámky a mutexy (viz například [3]).