View
50
Download
0
Category
Preview:
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
Citation preview
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
Recommended