Programowanie wielowątkowe

Slides:



Advertisements
Podobne prezentacje
System operacyjny i sterowniki urządzeń
Advertisements

Ćwiczenie (1) Dostosuj poniższy program do potrzeb zdefiniowanych w treści programu zaliczeniowego: #include void dodaj(){}; void edytuj(){}; void usun(){};
Wstęp do programowania
Równoległe kwerendy danych
Zdalne wywołania procedur
Jarosław Kuchta Semafory.
Jarosław Kuchta Monitory.
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe
Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Systemy rozproszone W. Bartkiewicz Wykład 9. Wprowadzenie do koordynacji programów współbieżnych.
dynamiczny przydział pamięci
argumenty wiersza poleceń: getopt
Nguyen Hung Son Uniwersytet Warszawski
Metody numeryczne Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie do informatyki.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C
Modularyzacja i struktury danych w C Copyright, 2005 © Jerzy R. Nawrocki Wprowadzenie.
Modularyzacja i struktury danych w C Copyright, 2005 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C Copyright, 2005 © Jerzy R. Nawrocki Wstęp.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Język C – Część II Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie do informatyki.
Wprowadzenie do SystemC
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Język ANSI C Operacje we/wy
Java – programowanie obiektowe
Zachodniopomorskie Centrum Edukacyjne Zadanie domowe.
Język Java Wielowątkowość.
Programowanie obiektowe W2
CUDA (Compute Unified Device Architecture)
Programowanie imperatywne i język C Copyright, 2006 © Jerzy R. Nawrocki Wstęp do.
Podstawy programowania w języku C i C++
Podstawy programowania
Podstawy informatyki 2012/2013
Podstawy programowania. Język C i C++– podstawy Temat: 1
Podstawy programowania w języku C i C++
Procedury i funkcje.
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Podstawy programowania w języku C i C++
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład IX.
Gramatyki i translatory
Programowanie obiektowe 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Okienkowy system operacyjny
jeszcze dygresja o macierzach...
PWSZ Gniezno // codefly 2009 Łukasz Tomczak
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++
Programowanie strukturalne i obiektowe C++ Przeładowanie operatorów Robert Nowak.
Iteracje w C# Informatyka Cele lekcji: Wiadomości: Uczeń potrafi:
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Programowanie strukturalne i obiektowe C++ Powtórzenie wiadomości z C++ Robert Nowak.
1 dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )
Programowanie proceduralne Podstawy Programowania dla geoinformatyków Wykład 3 Rafał Witkowski, 2015.
Model współbieżności w Javie
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie wielowątkowe w Javie Wykład 9 mgr inż. Michał Misiak.
Paweł Starzyk Obiektowe metody projektowania systemów
Systemy rozproszone W. Bartkiewicz Wykład 3. Procesy i wątki.
Funkcje - rekurencja Zajęcia 8. Funkcje - definicja Ogólna postać funkcji w C++: typZwracany nazwaFunkcji(listaParametrówWejściowychFunkcji) { ciało funkcji.
Programowanie imperatywne i język C Copyright, 2007 © Jerzy R. Nawrocki Wstęp do.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Wątki, programowanie współbieżne
Wskaźniki Elżbieta Labocha.
dynamiczny przydział pamięci
Tworzenie wątków w Javie
Zapis prezentacji:

Programowanie wielowątkowe Jarosław Kuchta Programowanie wielowątkowe

Procesy i wątki w systemie Windows Windows jest systemem wielowątkowym. Każdy proces ma przynajmniej jeden wątek, chociaż może mieć wiele wątków. Start programu, to start głównego wątku procesu. Główny wątek może uruchomić inny, poboczny wątek. Zamknięcie programu, to zamknięcie wszystkich wątków procesu.

Programowanie wielowątkowe w języku C Start programu: main(), wmain() – w programie konsoli WinMain(), wWinMain() – w programie okienkowym Procedura osobnego wątku: void ThreadProc(void *param) { … _endthread(); // zakończenie wątku }

Funkcje sterujące wątkami zadeklarowane w process.h: _beginthread – rozpoczęcie wątku _beginthreadex – rozszerzone rozpoczęcie wątku _endthread – zakończenie wątku _endthreadex – rozszerzone zakończenie wątku

Przykład – funkcja wątku void ThreadProc(void *param) { // ten wątek po prostu wypisuje parametr int h=*((int*)param); printf("%d Thread is Running!\n",h); _endthread(); }

Przykład – funkcja główna int main() { int n; int i; int val = 0; HANDLE handle; printf("\t Thread Demo\n"); printf("Enter the number of threads : "); scanf("%d",&n); for(i=1;i<=n;i++) val = i; handle = (HANDLE) _beginthread( ThreadProc,0,&val); // utworzenie wątku WaitForSingleObject(handle,INFINITE); // oczekiwanie na zakończenie wątku } return 0;

Programowanie wielowątkowe w MFC Hierarchia klas MFC: CObject – obiekt abstrakcyjny CCmdTarget – obiekt aktywny CWinThread – wątek Windows CWinApp – aplikacja Windows Aplikacja Windows jest wątkiem! Dwa rodzaje wątków: User Interface – wątek oparty o okna Worker – wątek pracujący w tle

Użyteczne dane m_nThreadID – identyfikator bieżącego wątku m_hThread – uchwyt bieżącego wątku m_bAutoDelete – czy wątek ma się sam usunąć po zamknięciu?

Funkcje wątkowe Funkcje globalne: Metody obiektowe: AfxBeginThread – utworzenie wątku AfxEndThread – zamknięcie wątku Metody obiektowe: CreateThread – utworzenie i wystartowanie wątku SuspendThread – zawieszenie wątku (inkrementacja licznika zawieszeń) ResumeThread – wznowienie wątku (dekrementacja licznika zawieszeń) SetThreadPriority – ustawienie priorytetu wątku GetThreadPriority – pobranie priorytetu wątku

Priorytety wątków THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_IDLE

Przykład z użyciem funkcji Afx CwinThread *pThread = AfxBeginThread( ThreadFunction, &data); UINT ThreadFunction(LPVOID param) { DWORD result =0 ; // do somthig AfxEndThread(exitCode); return result; }

Kończenie wątku funkcja TerminateThread() funkcja ExitThread() instrukcja return – zalecana, pozostałe nie czyszczą stosu.

Programowanie wielowątkowe w C# (1) // współdzielona zmienna private string _threadOutput = ""; // funkcja pierwszego wątku void DisplayThread1() { while (_stopThreads == false) { Console.WriteLine("Display Thread 1"); _threadOutput = "Hello Thread1"; Thread.Sleep(1000); // symulacja działania pierwszego wątku Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); } }

Programowanie wielowątkowe w C# (2) // funkcja drugiego wątku void DisplayThread2() { while (_stopThreads == false) { Console.WriteLine("Display Thread 2"); _threadOutput = "Hello Thread2"; Thread.Sleep(1000); // symulacja działania drugiego wątku Console.WriteLine("Thread 2 Output --> {0}", _threadOutput); }

Programowanie wielowątkowe w C# - inicjacja wątków Class1() { // utworzenie dwóch wątków Thread thread1 = new Thread(new ThreadStart(DisplayThread1)); Thread thread2 = new Thread(new ThreadStart(DisplayThread2)); // wystartowanie wątków thread1.Start(); thread2.Start(); }

Wynik Współdzielona zmienna jest asynchronicznie nadpisywana

Synchronizacja przez lock (1) // współdzielona zmienna private string _threadOutput = ""; // funkcja pierwszego wątku void DisplayThread1() { while (_stopThreads == false) { lock (this) // blokada na własnej instancji { Console.WriteLine("Display Thread 1"); _threadOutput = "Hello Thread1"; Thread.Sleep(1000); // symulacja działania pierwszego wątku Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); }

Synchronizacja przez lock (2) // funkcja drugiego wątku void DisplayThread2() { while (_stopThreads == false) { lock(this) // blokada na własnej instancji { Console.WriteLine("Display Thread 2"); _threadOutput = "Hello Thread2"; Thread.Sleep(1000); // symulacja działania drugiego wątku Console.WriteLine("Thread 2 Output --> {0}", _threadOutput); } } }

Wynik (po synchronizacji)

Synchronizacja przez AutoResetEvent (1) // zmienne sygnałowe do wzajemnego odblokowywania AutoResetEvent _blockThread1 = new AutoResetEvent(false); AutoResetEvent _blockThread2 = new AutoResetEvent(true); void DisplayThread_1() { while (_stopThreads == false) { // pierwszy wątek czeka, gdy drugi działa _blockThread1.WaitOne(); // po wołaniu Set przez drugi wątek, pierwszy kontynuuje działanie Console.WriteLine("Display Thread 1"); _threadOutput = "Hello Thread 1"; Thread.Sleep(1000); // symulacja działania pierwszego wątku Console.WriteLine("Thread 1 Output --> {0}", _threadOutput); // zakończenie działania – odblokowanie drugiego wątku _blockThread2.Set(); }

Synchronizacja przez AutoResetEvent (2) void DisplayThread_2() { while (_stopThreads == false) { // drugi wątek czeka, gdy pierwszy działa _blockThread2.WaitOne();  // po wołaniu Set przez pierwszy wątek, drugi kontynuuje działanie Console.WriteLine("Display Thread 2"); _threadOutput = "Hello Thread 2"; Thread.Sleep(1000); // symulacja działania drugiego wątku Console.WriteLine("Thread 2 Output --> {0}", _threadOutput);  // zakończenie działania – odblokowanie pierwszego wątku _blockThread1.Set(); }