Aplicaciones Multi-Threads-I

70
Aplicaciones Multi-Threads-I Aplicaciones Multi-Threads-I Ernesto Ernesto Cuadros Cuadros -V -V argas argas [email protected] [email protected] Sociedad Peruana de Sociedad Peruana de Computación Computación Perú Perú

description

Aplicaciones Multi-Threads-I. Ernesto Cuadros -V argas [email protected] Sociedad Peruana de Computación Perú. Organización de la presentación. Conceptos Básicos; Operaciones con hebras; Tipos de hebras; Comunicación entre hebras; Fibras; Otros puntos importantes; DEMOS; - PowerPoint PPT Presentation

Transcript of Aplicaciones Multi-Threads-I

Page 1: Aplicaciones Multi-Threads-I

Aplicaciones Multi-Threads-IAplicaciones Multi-Threads-I

ErnestoErnesto CuadrosCuadros-V-Vargasargas

[email protected]@spc.org.pe

Sociedad Peruana de ComputaciónSociedad Peruana de Computación

PerúPerú

Page 2: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

2Ernesto Cuadros-Vargas SPC

Organización de la presentaciónOrganización de la presentación Conceptos Básicos;Conceptos Básicos; Operaciones con hebras;Operaciones con hebras; Tipos de hebras;Tipos de hebras; Comunicación entre hebras;Comunicación entre hebras; Fibras;Fibras; Otros puntos importantes;Otros puntos importantes; DEMOS;DEMOS; Sugerencias y conclusiones.Sugerencias y conclusiones.

Page 3: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

3Ernesto Cuadros-Vargas SPC

Conceptos básicosConceptos básicos

programaprograma programa = algoritmos + ED;

procesoproceso abstracción de un programa en ejecución;

hebras o threadshebras o threads secuencia de ejecución de un proceso;

Page 4: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

4Ernesto Cuadros-Vargas SPC

Programa-Proceso-HebraPrograma-Proceso-Hebra

011011111010

Memoria

cargador

Page 5: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

5Ernesto Cuadros-Vargas SPC

Programación Multi-Threads Programación Multi-Threads

crear programas capaces de ejecutar crear programas capaces de ejecutar más de una tarea en paralelo;más de una tarea en paralelo;

las hebras pueden estar en el mismo las hebras pueden estar en el mismo proceso;proceso;

estamos preparados para aprovechar estamos preparados para aprovechar mas de un procesador.mas de un procesador.

Page 6: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

6Ernesto Cuadros-Vargas SPC

Origen de las hebras Origen de las hebras

Tiem

po

Proceso 1

Page 7: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

7Ernesto Cuadros-Vargas SPC

Origen de las hebras (cont) Origen de las hebras (cont)

Tiem

po

P2 P1

Page 8: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

8Ernesto Cuadros-Vargas SPC

Algunos ejemplosAlgunos ejemplos

manejadores de Bases de Datos;manejadores de Bases de Datos; servidores de Web;servidores de Web; servidores de FTP;servidores de FTP; grabación en segundo plano (ej. Word);grabación en segundo plano (ej. Word); compilación sin parar la edición, etc;compilación sin parar la edición, etc; nuestra vida diaria (trabajo en grupo, nuestra vida diaria (trabajo en grupo,

tareas en paralelo).tareas en paralelo).

Page 9: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

9Ernesto Cuadros-Vargas SPC

EvoluciónEvolución

sistemas monotareas vs.sistemas monotareas vs.sistemas multitaskingsistemas multitasking

programas ST vsprogramas ST vsprogramas MTprogramas MT

Page 10: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

10Ernesto Cuadros-Vargas SPC

VentajasVentajas

mayor aprovechamiento de la mayor aprovechamiento de la capacidad ociosa del procesador;capacidad ociosa del procesador;

podemos aprovechar mas de un podemos aprovechar mas de un procesador;procesador;

mayor paralelismo;mayor paralelismo; menor tiempo de respuesta que en menor tiempo de respuesta que en

forma secuencial, etc.forma secuencial, etc.

Page 11: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

11Ernesto Cuadros-Vargas SPC

DesventajasDesventajas

mayor complejidad;mayor complejidad; mayor cantidad de recursos necesarios mayor cantidad de recursos necesarios

(memoria, etc);(memoria, etc); política de planificación de procesos.política de planificación de procesos.

Page 12: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

12Ernesto Cuadros-Vargas SPC

Cuándo usar MT ?Cuándo usar MT ?

cuando mi programa presenta bloques cuando mi programa presenta bloques independientes;independientes;

cuando tengo una pérdida de tiempo cuando tengo una pérdida de tiempo considerable por operaciones de I/O;considerable por operaciones de I/O;

NÚMERO DE PROCESADORES.NÚMERO DE PROCESADORES.

Page 13: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

13Ernesto Cuadros-Vargas SPC

Transicion de ST a MTTransicion de ST a MT

las hebras de ejecutan independientes las hebras de ejecutan independientes unas de las otras unas de las otras Problemas !Problemas !

sincronizaciónsincronización en el mismo proceso (sibling Threads); en procesos diferentes.

Page 14: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

14Ernesto Cuadros-Vargas SPC

Planificador de procesos (Scheduler)Planificador de procesos (Scheduler)

2 3

4

1

Bloqueado (Blocked)Listos (Ready)

Corriendo (Running)

Page 15: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

15Ernesto Cuadros-Vargas SPC

Scheduler para 2 procesadoresScheduler para 2 procesadores

P1Listos (Ready)

Corriendo (Running)

Bloqueado (Blocked)

P5 P7

P4

P6

P2

P3 P8

Page 16: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

16Ernesto Cuadros-Vargas SPC

Proceso vs HebraProceso vs Hebra

una pila (una pila (StackStack); ); entrada en el

Scheduler; registros de la CPU;registros de la CPU; program counter, program counter,

etc.etc.

archivos abiertos;archivos abiertos; variables globales;variables globales; memoria asignada memoria asignada

dinamicamentedinamicamente, , etc.etc.

Page 17: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

17Ernesto Cuadros-Vargas SPC

Necesidad de SincronizaciónNecesidad de Sincronización

// Hebra 1 // Hebra 2(1) if( !PrinterBusy )

{(2) PrinterBusy = true;(3) MyPrint(“UNSA.txt”);

}

(1) If( !PrinterBusy ){

(2) PrinterBusy = true;(3) MyPrint(“Vitae.txt”);

}

// Hebra 1 // Hebra 2(1)

(2)

(3)

PrinterMutex.Lock();

MyPrint(“UNSA.txt”);

PrinterMutex.Unlock();

(1)

(2)

(3)

PrinterMutex.Lock();

MyPrint(“UNSA.txt”);

PrinterMutex.Unlock();

Ejemplos utilizando en la plataforma Win32Ejemplos utilizando en la plataforma Win32

Page 18: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

18Ernesto Cuadros-Vargas SPC

Problemas relacionados a la Problemas relacionados a la programación MTprogramación MT

Atomicidad;Atomicidad; Exclusión mutua:Exclusión mutua:

pedir un recurso, liberar el recurso

Race Conditions:Race Conditions: Un bug que depende del orden en el que

se ejecuten dos o más tareas independientes

Page 19: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

19Ernesto Cuadros-Vargas SPC

Atomicidad y exclusión mutuaAtomicidad y exclusión mutua

// Hebra 1 // Hebra 2(1) if( !PrinterBusy )

{(2) PrinterBusy = true;(3) MyPrint(“UNSA.txt”);

}

(1) If( !PrinterBusy ){

(2) PrinterBusy = true;(3) MyPrint(“Vitae.txt”);

}

// Hebra 1 // Hebra 2(1)

(2)

(3)

PrinterMutex.Lock();

MyPrint(“UNSA.txt”);

PrinterMutex.Unlock();

(1)

(2)

(3)

PrinterMutex.Lock();

MyPrint(“UNSA.txt”);

PrinterMutex.Unlock();

Page 20: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

20Ernesto Cuadros-Vargas SPC

Atomicidad (cont)Atomicidad (cont)

HANDLE hIOMutex= ::CreateMutex (NULL, FALSE, 0);

// Pedir acceso al recurso::WaitForSingleObject( hIOMutex, INFINITE );// Realizar nuestra operación crítica::fseek( fp, desired_position, 0L ); ::fwrite( data, sizeof( data ), 1, fp );

// Liberar el acceso al recurso ::ReleaseMutex(hIOMutex);

Page 21: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

21Ernesto Cuadros-Vargas SPC

Race ConditionsRace Conditions

// Hebra 1 // Hebra 2(1) if( !PrinterBusy )

{(2) PrinterBusy = true;(3) MyPrint(“UNSA.txt”);

}

(1) If( !PrinterBusy ){

(2) PrinterBusy = true;(3) MyPrint(“Vitae.txt”);

}

// Hebra 1 // Hebra 2(1)

(2)

(3)

PrinterMutex.Lock();

MyPrint(“UNSA.txt”);

PrinterMutex.Unlock();

(1)

(2)

(3)

PrinterMutex.Lock();

MyPrint(“UNSA.txt”);

PrinterMutex.Unlock();

Page 22: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

22Ernesto Cuadros-Vargas SPC

Problemas relacionados a Problemas relacionados a programación MT (cont)programación MT (cont)

Deadlock;Deadlock; Diseño de clases seguras para Diseño de clases seguras para

ambientes MT;ambientes MT; Starvation (morir de hambre)Starvation (morir de hambre)

Threads de prioridades altas siempre ganaran el procesador.

Page 23: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

23Ernesto Cuadros-Vargas SPC

Deadlock (bloqueo mutuo)Deadlock (bloqueo mutuo)

Hebra 1 Hebra 2

deadlock

R1 R2

Page 24: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

24Ernesto Cuadros-Vargas SPC

Clases seguras para ambientes MTClases seguras para ambientes MT

void MyClass::PrintHistorico(){ m_report = Historico; Imprimir();}

void MyClass::PrintHistorico(){ m_report = Historico; Imprimir();}

void MyClass::Imprimir(){ switch(m_report) { case Datos_Personales: …… break; case Datos_Personales: …… break; }}

Thread1Thread1 Thread2Thread2

void MyClass::PrintPersonalInfo(){ m_report = Datos_Personales; Imprimir();}

void MyClass::PrintPersonalInfo(){ m_report = Datos_Personales; Imprimir();}

Page 25: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

25Ernesto Cuadros-Vargas SPC

Mecanismos de SincronizaciónMecanismos de Sincronización

por la cantidad de estados:por la cantidad de estados: binarios, de múltiples estados.

por su alcance:por su alcance: dentro del mismo proceso, entre procesos.

Page 26: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

26Ernesto Cuadros-Vargas SPC

Por la cantidad de estadosPor la cantidad de estados

binariosbinarios Events (CEvent), CriticalSection (CCriticalSection), Mutex (CMutex).

de múltiples estados:de múltiples estados: Semáforos (CSemaphore)

Page 27: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

27Ernesto Cuadros-Vargas SPC

Por su alcancePor su alcance

dentro del mismo proceso:dentro del mismo proceso: CriticalSection

entre procesos:entre procesos: Event, Mutex, Semáforos,

también sirven en el mismo proceso.

Page 28: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

28Ernesto Cuadros-Vargas SPC

Entre procesosEntre procesos

Semáforo “Impresion”

Handle(7)

Semáforo “Impresion”

Handle(35)

Proceso 1 Proceso 2

Win32Win32Semaphore “Impresion” Kernel Object

Usage Counter=2More information ….

Page 29: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

29Ernesto Cuadros-Vargas SPC

Tipos de hebrasTipos de hebras

worker threadsworker threads o hebras trabajadoras; o hebras trabajadoras; hebras con interface de usuario.hebras con interface de usuario.

Page 30: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

30Ernesto Cuadros-Vargas SPC

Worker ThreadWorker Thread

para tareas en background o en para tareas en background o en segundo plano;segundo plano;

cuando no necesitamos enviar o recibir cuando no necesitamos enviar o recibir mensajes a través de ventanas; mensajes a través de ventanas;

no es necesario interactuar con la no es necesario interactuar con la hebra.hebra.

Page 31: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

31Ernesto Cuadros-Vargas SPC

Pasos para crear una Worker ThreadPasos para crear una Worker Thread

programar una función que será al programar una función que será al “main” de la hebra,“main” de la hebra,

crear la hebra propiamente dicha con crear la hebra propiamente dicha con alguna de las funciones API alguna de las funciones API (CreateThread, _beginthread)(CreateThread, _beginthread)

Page 32: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

32Ernesto Cuadros-Vargas SPC

Paso 1: Programar una función que Paso 1: Programar una función que será el “main” de la hebraserá el “main” de la hebra

DWORD WINAPI MyThreadMain(LPVOID lpParameter)

{

CStudent *pMyObj = (CStudent *)lpParameter;

pMyObj->MyMethod1();

pMyObj->MyMethod2();

.

.

.

return 0L;

}}

Page 33: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

33Ernesto Cuadros-Vargas SPC

Paso 2: Creación de una Thread con Paso 2: Creación de una Thread con CreateThreadCreateThread

HANDLE CreateThread(// puntero a los atributos de securidad

LPSECURITY_ATTRIBUTES lpThreadAttributes,

// Tamaño inicial del Stack para esta hebra

DWORD dwStackSize,

// puntero a la función de la hebra

LPTHREAD_START_ROUTINE lpStartAddress,

// argumento para la nueva hebra

LPVOID lpParameter,

// atributos de creación

DWORD dwCreationFlags,

// puntero para recibir el ID de la hebra

LPDWORD lpThreadId );

Page 34: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

34Ernesto Cuadros-Vargas SPC

Paso 2: Creación de una Thread con Paso 2: Creación de una Thread con CreateThread (cont)CreateThread (cont)

CStudent *pMyObj = new CStudent;

DWORD ThreadID;

HANDLE myhandle = CreateThread(

NULL, 4096,

&MyThreadMain, (LPVOID)pMyObj,

0, // CREATE_SUSPENDED

&ThreadId );

Page 35: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

35Ernesto Cuadros-Vargas SPC

Hebras usando C Run-Time LibraryHebras usando C Run-Time Library

void __cdecl MyThreadMain2(void *lpParameter)

{

CStudent *pMyObj = (CStudent *)lpParameter;

pMyObj->MyMethod1();

pMyObj->MyMethod2();

.

.

.

return 0L;

}}

Page 36: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

36Ernesto Cuadros-Vargas SPC

Paso 2: Creación de una Thread con Paso 2: Creación de una Thread con _beginthread (cont)_beginthread (cont)

unsigned long _beginthread( // Puntero a la funcion que controlará la hebravoid( __cdecl *start_address )( void * ),// Tamaño del stackunsigned stack_size,// Lista de argumentosvoid *arglist );

HANDLE handle = (HANDLE)_beginthread(& MyThreadMain2, 4096,NULL);

Page 37: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

37Ernesto Cuadros-Vargas SPC

Operaciones básicas con una hebraOperaciones básicas con una hebra

::WaitForSingleObject(hThread, 5); ::WaitForSingleObject(hThread, INFINITE); ::SuspendThread(hThread);::SuspendThread(hThread); ::ResumeThread(hThread);::ResumeThread(hThread);

Page 38: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

38Ernesto Cuadros-Vargas SPC

Prioridades de una Thread Prioridades de una Thread (SetThreadPriority)(SetThreadPriority)

::SetThreadPriority(hThread, ::SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);THREAD_PRIORITY_ABOVE_NORMAL);

THREAD_PRIORITY_ABOVE_NORMAL;THREAD_PRIORITY_ABOVE_NORMAL;THREAD_PRIORITY_BELOW_NORMAL;THREAD_PRIORITY_BELOW_NORMAL;THREAD_PRIORITY_HIGHEST;THREAD_PRIORITY_HIGHEST;THREAD_PRIORITY_IDLE;THREAD_PRIORITY_IDLE;THREAD_PRIORITY_LOWEST;THREAD_PRIORITY_LOWEST;THREAD_PRIORITY_NORMAL;THREAD_PRIORITY_NORMAL;THREAD_PRIORITY_TIME_CRITICAL.THREAD_PRIORITY_TIME_CRITICAL.

Page 39: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

39Ernesto Cuadros-Vargas SPC

Prioridades para todo el procesoPrioridades para todo el proceso

::SetPriorityClass(GetCurrentProcess(), ::SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); HIGH_PRIORITY_CLASS);

HIGH_PRIORITY_CLASS;HIGH_PRIORITY_CLASS;IDLE_PRIORITY_CLASS;IDLE_PRIORITY_CLASS;NORMAL_PRIORITY_CLASS;NORMAL_PRIORITY_CLASS;REALTIME_PRIORITY_CLASS.REALTIME_PRIORITY_CLASS.

Page 40: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

40Ernesto Cuadros-Vargas SPC

Demo Worker ThreadsDemo Worker Threads

Break !Break !

Page 41: Aplicaciones Multi-Threads-I

Aplicaciones Multi-Threads-IIAplicaciones Multi-Threads-II

ErnestoErnesto CuadrosCuadros--VargasVargas

[email protected]@spc.org.pe

Sociedad Peruana de ComputaciónSociedad Peruana de Computación

Piura-PerúPiura-Perú

Page 42: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

42Ernesto Cuadros-Vargas SPC

Hebras con interfaceHebras con interface

útiles cuando necesitamos enviar útiles cuando necesitamos enviar mensajes o interactuar a través de mensajes o interactuar a través de algún mecanismo visible al usuario algún mecanismo visible al usuario (generalmente una ventana)(generalmente una ventana)

existe la clase CWinThread (MFC)existe la clase CWinThread (MFC)

Page 43: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

43Ernesto Cuadros-Vargas SPC

Secuencia de creaciónSecuencia de creación

crear la clase heredada de crear la clase heredada de CWinThreadCWinThread (inicialmente esta vacía);(inicialmente esta vacía);BOOL CMyThread::InitInstance()

{

return TRUE;

}

crear la hebra hija;crear la hebra hija;

Page 44: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

44Ernesto Cuadros-Vargas SPC

Crear la hebra hijaCrear la hebra hija

void CMainFrame::OnNuevaThread()

{

// TODO: Add your command handler code here

CRuntimeClass *pRuntimeClass = RUNTIME_CLASS(CMyThread);

CMyThread *pMyThread =

(CMyThread *)pRuntimeClass->CreateObject();

pMyThread->CreateThread();

}

Page 45: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

45Ernesto Cuadros-Vargas SPC

Crear la hebra hija (cont)Crear la hebra hija (cont)

BOOL CMyThread::InitInstance()

{ CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CTeste2Doc), // clase del documento

RUNTIME_CLASS(CMainFrame), // clase del MainFrame

RUNTIME_CLASS(CTeste2View)); // clase del área de cliente

// Crear un nuevo documento para esta ventana

CDocument *pDoc = pDocTemplate->CreateNewDocument();

// Crear la ventana propiamente dicha

m_pMainWnd = pDocTemplate->CreateNewFrame(pDoc, NULL);

// Hacerla visible

m_pMainWnd->ShowWindow(SW_SHOW);

// Enviarle un mensage de actualizacion

m_pMainWnd->UpdateWindow();

return TRUE;

}

Page 46: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

46Ernesto Cuadros-Vargas SPC

Comunicación entre ventanas y/o Comunicación entre ventanas y/o hebrashebras

colas de mensajescolas de mensajes de tamaño fijo en Win16 dinámicas en Win32 (listas enlazadas)

SendMessageSendMessage PostMessagePostMessage PostThreadMessagePostThreadMessage SendMessageTimeoutSendMessageTimeout

Page 47: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

47Ernesto Cuadros-Vargas SPC

PostMessagePostMessage

PostMessagePostMessage((HWNDHWND hWnd, hWnd, UINTUINT msg, msg, WPARAMWPARAM, , LPARAMLPARAM););

coloca el mensaje en la fila de la hebra coloca el mensaje en la fila de la hebra que creó hWnd y retorna.que creó hWnd y retorna.

Page 48: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

48Ernesto Cuadros-Vargas SPC

SendMessageSendMessage

SendMessageSendMessage(HWND hWnd, (HWND hWnd, UINT msg, WPARAM, LPARAM)UINT msg, WPARAM, LPARAM)

coloca el mensaje en la fila de la hebra coloca el mensaje en la fila de la hebra que creó hWndque creó hWnd

espera hasta que el mensaje sea espera hasta que el mensaje sea procesadoprocesado

retornaretorna

Page 49: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

49Ernesto Cuadros-Vargas SPC

PostThreadMessagePostThreadMessage

PostThreadMessagePostThreadMessage((DWORDDWORD ThreadID, ThreadID,UINTUINT msg, msg, WPARAMWPARAM, , LPARAMLPARAM))

coloca el mensaje en la fila de la hebra coloca el mensaje en la fila de la hebra identificada con ThreadIDidentificada con ThreadID

retornaretorna

Page 50: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

50Ernesto Cuadros-Vargas SPC

Importante:Importante:SendMessage (entre ventanas)SendMessage (entre ventanas)

una ventana procesa sus mensajes una ventana procesa sus mensajes cuando la hebra que la creo esta activa!cuando la hebra que la creo esta activa!

un mensaje siempre va a la cola de un mensaje siempre va a la cola de mensajes de la hebra que la creó.mensajes de la hebra que la creó.

Page 51: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

51Ernesto Cuadros-Vargas SPC

Creando una función para recibir Creando una función para recibir mensajesmensajes

LRESULT CMyThread::MyFuncion(LPARAM wParam, LPARAM lParam)

{

// Aqui debemos agregar nuestro código

return 0L;

}

Page 52: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

52Ernesto Cuadros-Vargas SPC

Mapeando un mensaje a una función Mapeando un mensaje a una función en la clase heredada de CWinThreaden la clase heredada de CWinThread

BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP(CMyThread, (CMyThread, CWinThreadCWinThread))

//{{AFX_MSG_MAP(CMyThread)//{{AFX_MSG_MAP(CMyThread)

ON_THREAD_MESSAGE(WM_MYMESSAGE, MyFuncion)ON_THREAD_MESSAGE(WM_MYMESSAGE, MyFuncion)

//}}AFX_MSG_MAP//}}AFX_MSG_MAP

END_MESSAGE_MAPEND_MESSAGE_MAP()()

// #define WM_MYMESSAGE (WM_USER+1)// #define WM_MYMESSAGE (WM_USER+1)

…………..

LRESULT CMyThread::MyFuncion(LRESULT CMyThread::MyFuncion(LPARAM wParam, LPARAM lParam)LPARAM wParam, LPARAM lParam)

{{ // Aqui debemos agregar nuestro código// Aqui debemos agregar nuestro código

return 0L;return 0L;}}

Page 53: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

53Ernesto Cuadros-Vargas SPC

Mapeando un mensaje a una función Mapeando un mensaje a una función de una ventanade una ventana

BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP(CMyEdit, (CMyEdit, CEditCEdit))

//{{AFX_MSG_MAP(CMyThread)//{{AFX_MSG_MAP(CMyThread)

ON_THREAD_MESSAGE(WM_MYMESSAGE, MyFuncion)ON_THREAD_MESSAGE(WM_MYMESSAGE, MyFuncion)

//}}AFX_MSG_MAP//}}AFX_MSG_MAP

END_MESSAGE_MAPEND_MESSAGE_MAP()()

// #define WM_MYMESSAGE (WM_USER+1)// #define WM_MYMESSAGE (WM_USER+1)

…………..

LRESULT LRESULT CMyThread::MyFuncion(CMyThread::MyFuncion(LPARAM LPARAM wParamwParam, LPARAM , LPARAM lParamlParam))

{{ // Aqui debemos agregar nuestro código// Aqui debemos agregar nuestro código

return return 0L0L;;}}

Page 54: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

54Ernesto Cuadros-Vargas SPC

Comunicación entre ventanas y/o Comunicación entre ventanas y/o hebras (cont)hebras (cont)

SendMessageCallbackSendMessageCallback VOID CALLBACK

SendMessageCallback(HWND hWnd, UINT uMsg,DWORD dwData,LRESULT lResult);

Page 55: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

55Ernesto Cuadros-Vargas SPC

Comunicación entre ventanas y/o Comunicación entre ventanas y/o hebras (cont)hebras (cont)

SendNotifyMessageSendNotifyMessage coloca el mensaje en la cabeza de la lista

de la otra hebra y retorna; si esta en la misma hebra se comporta

igual que SendMessage. MsgWaitForMultipleObjectsMsgWaitForMultipleObjects

espera por mensajes en su propia fila de mensajes.

Page 56: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

56Ernesto Cuadros-Vargas SPC

Otras formas de comunicaciónOtras formas de comunicación

Memoria Compartida Memoria Compartida ((Shared MemoryShared Memory),),

Archivos Mapeados a memoriaArchivos Mapeados a memoria((Memory Mapped FilesMemory Mapped Files),),

Tubos Anónimos Tubos Anónimos ((Anonymous PipesAnonymous Pipes),),

Page 57: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

57Ernesto Cuadros-Vargas SPC

Memoria Compartida (Memoria Compartida (Shared Memory Shared Memory & Memory Mapped Files& Memory Mapped Files))

crear el archivo (crear el archivo (CreateFileCreateFile, , OpenFileOpenFile)) CreateFileMappingCreateFileMapping MapViewOfFileMapViewOfFile

Page 58: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

58Ernesto Cuadros-Vargas SPC

Memoria Compartida (Memoria Compartida (Shared Memory Shared Memory & Memory Mapped Files& Memory Mapped Files))HANDLEHANDLE hFile, hMapping; hFile, hMapping;LPVOIDLPVOID lpBaseAddress; lpBaseAddress;// mapear el archivo …// mapear el archivo …hFile = hFile = CreateFileCreateFile( "somefile.dat", ...);( "somefile.dat", ...);hMapping = hMapping = CreateFileMappingCreateFileMapping( hFile, ...);( hFile, ...);lpBaseAddress = lpBaseAddress = MapViewOfFileMapViewOfFile( hMapping, ...);( hMapping, ...);// MapViewOfFile incrementó los contadores de uso de los objetos… // MapViewOfFile incrementó los contadores de uso de los objetos… CloseHandleCloseHandle(hFile);(hFile);

CloseHandleCloseHandle(hMapping);(hMapping);

// usar lpBaseAddress aquí ...// usar lpBaseAddress aquí ...

UnmapViewOfFileUnmapViewOfFile(lpBaseAddress);(lpBaseAddress);

// decrementa los contadores de uso de hFile y hMapping // decrementa los contadores de uso de hFile y hMapping

// destruyéndolos// destruyéndolos

DEMODEMO

Page 59: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

59Ernesto Cuadros-Vargas SPC

Tubos (Tubos (PipesPipes))

tubos bidireccionales para pasar datos,tubos bidireccionales para pasar datos, anónimos (Win95, WinNT, etc) named Pipes (sólo se pueden crear desde

WinNT, pero pueden ser abiertos desde Win95)

remotamente remotamente \\.\pipe\mi-nuevo-pipe

Page 60: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

60Ernesto Cuadros-Vargas SPC

Tubos (Tubos (PipesPipes) (cont)) (cont)

poseen dos conductosposeen dos conductos Lectura, Escritura

envío de datos: First In First Out (FIFO)envío de datos: First In First Out (FIFO)

Page 61: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

61Ernesto Cuadros-Vargas SPC

Tubos Anónimos Tubos Anónimos ((Anonymous PipesAnonymous Pipes))

BOOL CreatePipe( // pointer to read handle PHANDLE hReadPipe, // pointer to write handle PHANDLE hWritePipe, // pointer to security attributes LPSECURITY_ATTRIBUTES lpPipeAttributes, // pipe size DWORD nSize);

Page 62: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

62Ernesto Cuadros-Vargas SPC

FibrasFibras

unidad de ejecución que puede ser manualmente activada por la aplicaciones;

el usuario puede decidir cuando darle el procesador a otra fibra;

corren en el contexto de una hebra; una hebra puede controlar múltiples

fibras.

Page 63: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

63Ernesto Cuadros-Vargas SPC

Fibras (cont)Fibras (cont)

en general no ofrecen ventajas sin son comparadas con una aplicación Multi-hebras bien diseñada;

mejor aprender a controlas bien las hebras.

Page 64: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

64Ernesto Cuadros-Vargas SPC

Fibras (cont)Fibras (cont)

ConvertThreadToFiber CreateFiber DeleteFiber GetCurrentFiber GetFiberData SwitchToFiber

Page 65: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

65Ernesto Cuadros-Vargas SPC

Otros puntos importantesOtros puntos importantes

MCL (Multithreading Class Library);MCL (Multithreading Class Library); depuración de hebras;depuración de hebras; ningún depurador substituye un buen ningún depurador substituye un buen

diseño previo.diseño previo.

Page 66: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

66Ernesto Cuadros-Vargas SPC

Experimentos:Experimentos:El problema de los filósofosEl problema de los filósofos

Page 67: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

67Ernesto Cuadros-Vargas SPC

Experimentos: Proyecto Informedia-CMUExperimentos: Proyecto Informedia-CMUFastmap ST vs. Fastmap MT (2-CPUs)Fastmap ST vs. Fastmap MT (2-CPUs)

Page 68: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

68Ernesto Cuadros-Vargas SPC

SugerenciasSugerencias

la naturaleza del problema;la naturaleza del problema; atomicidad del código (el Scheduler atomicidad del código (el Scheduler

podría parar la ejecución);podría parar la ejecución); estados de espera óptimos;estados de espera óptimos; cantidad de hebras.cantidad de hebras.

Page 69: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

69Ernesto Cuadros-Vargas SPC

ConclusionesConclusiones

depende de la naturaleza del problema depende de la naturaleza del problema mas que del tipo de máquina,mas que del tipo de máquina,

los programas MT pueden correr con los programas MT pueden correr con una CPU pero están preparados para una CPU pero están preparados para trabajar con mas CPU,trabajar con mas CPU,

el número de hebras está vinculado al el número de hebras está vinculado al número de procesadores y a la cantidad número de procesadores y a la cantidad de operaciones con I/O.de operaciones con I/O.

Page 70: Aplicaciones Multi-Threads-I

Ap

licacio

nes M

ulti-H

eb

ras

70Ernesto Cuadros-Vargas SPC

GRACIAS !GRACIAS !Ernesto Cuadros-VargasErnesto Cuadros-Vargas

Sociedad Peruana de ComputaciónSociedad Peruana de Computación

http://socios.spc.org.pe/ecuadros/http://socios.spc.org.pe/ecuadros/

[email protected]@spc.org.pe