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]).