aplicaciones multi-threads-i

Post on 04-Jan-2016

50 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Aplicaciones Multi-Threads-I. Ernesto Cuadros -V argas ecuadros@spc.org.pe 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

Aplicaciones Multi-Threads-IAplicaciones Multi-Threads-I

ErnestoErnesto CuadrosCuadros-V-Vargasargas

ecuadros@spc.org.peecuadros@spc.org.pe

Sociedad Peruana de ComputaciónSociedad Peruana de Computación

PerúPerú

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.

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;

Ap

licacio

nes M

ulti-H

eb

ras

4Ernesto Cuadros-Vargas SPC

Programa-Proceso-HebraPrograma-Proceso-Hebra

011011111010

Memoria

cargador

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.

Ap

licacio

nes M

ulti-H

eb

ras

6Ernesto Cuadros-Vargas SPC

Origen de las hebras Origen de las hebras

Tiem

po

Proceso 1

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

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

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

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.

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.

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.

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.

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)

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

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.

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

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

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();

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);

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();

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.

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

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();}

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.

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)

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.

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 ….

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.

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.

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)

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;

}}

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 );

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 );

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;

}}

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);

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);

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.

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.

Ap

licacio

nes M

ulti-H

eb

ras

40Ernesto Cuadros-Vargas SPC

Demo Worker ThreadsDemo Worker Threads

Break !Break !

Aplicaciones Multi-Threads-IIAplicaciones Multi-Threads-II

ErnestoErnesto CuadrosCuadros--VargasVargas

ecuadros@spc.org.peecuadros@spc.org.pe

Sociedad Peruana de ComputaciónSociedad Peruana de Computación

Piura-PerúPiura-Perú

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)

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;

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();

}

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;

}

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

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.

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

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

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ó.

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;

}

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;}}

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;;}}

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);

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.

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),),

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

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

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

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)

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);

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.

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.

Ap

licacio

nes M

ulti-H

eb

ras

64Ernesto Cuadros-Vargas SPC

Fibras (cont)Fibras (cont)

ConvertThreadToFiber CreateFiber DeleteFiber GetCurrentFiber GetFiberData SwitchToFiber

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.

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

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)

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.

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.

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/

ecuadros@spc.org.peecuadros@spc.org.pe

top related