watki.cpp

/*
 * plik ma na celu prezentację podstawowych zagadnień z programowania w języku C++
 * prezentuje:
 *  - tworzenie programów wielowątkowych
 *  - korzystanie z mutexów
 *  - korzystanie z asynchronicznego io jako timera
 *  - korzystanie z kolejki C++
 *  - podatwy obsługi czasu ...
 *
 * kompilacja: gcc -lboost_date_time-mt -lboost_system-mt -lboost_thread-mt watki.cpp
 */


#include <queue>

#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>

#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

#include <string>
#include <iostream>

std::queue<std::string> kolejka;

boost::mutex mutex;

int globalna=13;

class Watki {
public:
  int parametr_watku;
  void operator()() {
    std::cout << "to wątek z parametrem " << parametr_watku;
    std::cout << " globalna = " << globalna << std::endl;
    boost::this_thread::sleep(boost::posix_time::seconds(5));
    std::cout << "a teraz (nadal) z parametrem " << parametr_watku;
    std::cout << " globalna = " << globalna << std::endl;
    
    
    for (int i=0; i<6; i++) {
      boost::this_thread::sleep(boost::posix_time::millisec(700));
      boost::mutex::scoped_lock scoped_lock(mutex);
      // powyższy mutex blokuje od teraz do końca bloku
      // warto też wspomnieć o muteksach odpornych na blokowanie
      // już zablokowanego przez nas samych - boost::recursive_mutex
      
      if (!kolejka.empty()) {
        std::cout << i << ") odebrałem z kolejki " << kolejka.front() << std::endl;
        kolejka.pop();
      }
    }
    
  }
};

void zdarzenie(const boost::system::error_code&) {
  std::cout << "budzik start" << std::endl;
  boost::this_thread::sleep(boost::posix_time::seconds(5));
  std::cout << "budzik stop" << std::endl;
}


int main() {
  Watki funktor_watek1;
  
  funktor_watek1.parametr_watku=56;
  boost::thread watek1(funktor_watek1);
  boost::this_thread::sleep(boost::posix_time::seconds(2));
  funktor_watek1.parametr_watku=78;
  globalna=58;
  
  boost::this_thread::sleep(boost::posix_time::seconds(2));
  
  mutex.lock();
  kolejka.push("Ala ma kota");
  kolejka.push("Kot ma Ale");
  mutex.unlock();
  
  std::cout << "2 piersze elementy sa w kolejce" << std::endl;
  boost::this_thread::sleep(boost::posix_time::seconds(2));
  
  mutex.lock();
  kolejka.push("Abecadlo");
  kolejka.push("z pieca spadlo");
  mutex.unlock();
  
  std::cout << "2 kolejne elementy sa w kolejce" << std::endl;
  
  // asynchroniczne IO jako alarm
  boost::asio::io_service ios;
  boost::asio::deadline_timer budzik(ios, boost::posix_time::seconds(1.5));
  budzik.async_wait(zdarzenie);
  std::cout << "czekamy na budzik" << std::endl;
  ios.run(); // uruchomienie pętli obsługi
  std::cout << "po budziku" << std::endl;
}

XHTML generated by highlight (http://www.andre-simon.de/) from watki.cpp



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/c_cpp/watki.cpp) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:41 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).