Diferencia entre revisiones de «Pthreads visual studio 2010»

De Wikitronica
Saltar a: navegación, buscar
(Agregando Librerias de PThreads)
 
(No se muestran 21 ediciones intermedias de 10 usuarios)
Línea 1: Línea 1:
****************************************************************************************************************
+
En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2010, con el fin de trabajar con los hilos '''''POSIX''''' usando el lenguaje de programación '''''C++'''''. Esto nos brindará la posibilidad de trabajar con hilos de una manera amplia, cumpliendo los estandares POSIX, como tambien rutinas de sincronización.
****************************************************************************************************************
+
****************************************************************************************************************
+
 
+
NOTA! Es igual que el VS 2012, porque me copie el articulo para tenerlo de base!!!
+
 
+
[https://www.dropbox.com/s/5o2yzfxtqmig7y7/TutorialVisualStudio2010conPosixThreads.pdf?m '''Para un inicio mas rapido mientras se termina de crear este articulo, ir al tutorial original del profesor Raúl Acuña.''']
+
 
+
****************************************************************************************************************
+
****************************************************************************************************************
+
****************************************************************************************************************
+
 
+
 
+
En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2012, con el fin de trabajar con los hilos '''''POSIX''''' usando el lenguaje de programación '''''C++'''''.  
+
 
+
Este artículo, no pretende dar una completa explicación de lo que son los hilos POSIX (ni el respectivo estándar) ni el lenguaje de programación C++, mas si ofrecerá una breve descripción, con los conceptos básicos, para un rápido entendimiento.
+
  
 
Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo.  
 
Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo.  
  
==Visual Studio 2012==
+
==Visual Studio 2010==
 
+
info visual
+
 
+
//////////////////////////////////////////////////////
+
//////////////////////////////////////////////////////
+
selfnote: preguntar como agregar tabla de información "a lo wikipedia".
+
como agregar imagenes.
+
actualizar los links en la referencia (wiki, c++, láminas, libros)
+
//////////////////////////////////////////////////////
+
//////////////////////////////////////////////////////
+
  
 +
{| style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" border="1" cellpadding="0" cellspacing="1" align="center"
 +
|+'''Datos de programa'''
 +
|-
 +
! style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" colspan="3" align="center"| Microsoft Visual Studio 2010
 +
|-
 +
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Desarrollador'''
 +
|-
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" |Página oficial de
 +
|style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://msdn.microsoft.com/en-us/library/dd831853(v=vs.100).aspx Microsoft Visual Studio]
 +
|-
 +
|style="background:#ccffff;border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center" colspan="3"|'''Información General'''
 +
|-
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Fecha de Lanzamiento:
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|12 Abril 2010
 +
|-
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Género:
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|IDE
 +
|-
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|OS:
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Windows 32 o 64-bits
 +
|-
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|Licencia estudiantil:
 +
| style="border-bottom:3px solid white; border-left:3px solid white; border-top:3px solid white; border-right:3px solid white" align="center"|[http://e5.onthehub.com/WebStore/ProductsByMajorVersionList.aspx?ws=762c9a71-a39b-e011-969d-0030487d8897&vsro=8 Alianza USB-Microsoft]
 +
|-
 +
|}
  
 
==Posix Threads==
 
==Posix Threads==
Línea 43: Línea 43:
 
Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.
 
Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.
  
'''Nota:''' En la sección ''Configurar Visual Studio 2012 con pthreads (Posix Threads)'' se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.
+
'''Nota:''' En la sección [[Pthreads visual studio 2012|''Configurar Visual Studio 2012 con pthreads (Posix Threads)'']] se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.
  
 
==C++==
 
==C++==
  
'''C++''' ''(C mas mas)'' es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación ''C'' a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como ''classes'' y definiciones de nuevos ''tipos de datos'' no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.
+
'''C++''' ''(C más más)'' es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación ''C'' a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como ''classes'' y definiciones de nuevos ''tipos de datos'' no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.
  
Para efectos prácticos de este artículo, se configurará a continuación el ''Visual Studio 2012'' para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.
+
{|align="center" style="border-bottom:3px solid black; border-left:3px solid black; border-top:3px solid black; border-right:3px solid black" cellspacing="10"
 +
|+'''Tipos aritméticos en C++'''
 +
|-
 +
!style="border-bottom: solid grey" |Tipo
 +
!style="border-bottom: solid grey" |Significado
 +
!style="border-bottom: solid grey" |Tamaño mínimo
 +
|-
 +
|bool
 +
|''boolean''(lógico)
 +
| --
 +
|-
 +
|char
 +
|carácter
 +
|8bits
 +
|-
 +
|wchar_t
 +
|carácter ancho
 +
|16bits
 +
|-
 +
|short
 +
|enter-corto
 +
|16bits
 +
|-
 +
|int
 +
|entero
 +
|16bits
 +
|-
 +
|long
 +
|largo-entero
 +
|32bits
 +
|-
 +
|float
 +
|real precisión simple
 +
|~7 dígitos significativos
 +
|-
 +
|double
 +
|real precisión doble
 +
|~15 dígitos significativos
 +
|-
 +
|long double
 +
|real precisión doble extendido
 +
|~15 dígitos significativos
 +
|-
 +
|}
  
  
==Configurar Visual Studio 2012 con pthreads (Posix Threads)==
+
Hay que tener en cuenta, para los casos en los que se trabaje E/S (Entradas y Salidas) con el lenguaje de programación C++, se debe incluir la directiva o biblioteca estándar ''<iostream>'' que llegaría a ser el equivalente al ''stdio'' en C.
En primera instancia, se debe tener Visual Studio 2012 instaldo en la computadora a trabajar. Lo siguiente es descargar estos [https://www.dropbox.com/s/pl2qghdiu8nswtz/Archivos%20pthreads.rar '''Archivos para PThreads - Windows'''], los cuales incluyen las “librerías” e “includes” necesarios.
+
  
===Creando Proyecto App Win32===
+
<syntaxhighlight lang="C">
Lo siguiente que se va a hacer, será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Esto se puede realizar, dando click en “New Project” en el Start Page (Nuevo Proyecto en su defecto), como también buscando en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación ''crtl+shift+n''.
+
#include <iostream>
 +
</syntaxhighlight>
  
//////Imágenes/////
+
Nótese, que no es necesario colocar ''.h'' en este formato, gracias a los nuevos tipos de archivos cabezera de ANSI implementados en dicho lenguaje.
  
 +
Dentro de esta directiva, se encuentran 2 tipos de representaciones tanto para la entrada como para la salida, istream y ostream respectivamente, en los cuales se definen los símbolos de transmisión y recepción de datos:
 +
{|align="center" border="1" style="border-bottom: solid black, border-top: solid black, border-left: solid black,border-right: solid black"
 +
|+
 +
|-
 +
|std:: cin 
 +
|Canal de entrada estándar
 +
|-
 +
|std:: cout 
 +
|Canal de salida estándar
 +
|-
 +
|std:: cerr 
 +
|Canal de salida de error
 +
|-
 +
|std:: endl 
 +
|Símbolo para avance de línea
 +
|-
 +
|}
 +
 +
La entrada se realiza de manera estándar, a través de un canal como el teclado. La salida, tanto de dato como errores, se realiza de manera estándar, generalmente por pantalla. Estos canales tanto de entrada como de salida, son los que generalmente se usan, aunque pueden ser redirigidos los datos a otro canal capaz de transmitir o recibir datos, ya sea por sistema operativo o funciones de sistema.
 +
 +
Para poder dirigir un dato por el canal de salida, se ha de usar el operador ''<<'', mientras que para entrada, ''>>''. Incluso, se puede llegar a encadenar múltiples salidas o entradas, por ejemplo, el trozo de código:
 +
<syntaxhighlight lang="C">
 +
''std:: cout << "Nací el día" << v_dia << "del mes" << v_mes << "del año" << v_agno << std::endl;'' (Siendo v_dia, v_mes y v_agno, las
 +
respectivas variables)
 +
 +
</syntaxhighlight>
 +
 +
Dicho formato también aplica para introducir múltiples entradas.
 +
 +
'''Código ejemplo:'''
 +
<syntaxhighlight lang="C">
 +
#include <iostream>
 +
 +
int main()
 +
{
 +
  int n1, n2;
 +
  std::cout<< "Introducir dos números:" << std:: endl;  // Indicando de salida el string o línea de caracteres ''Introducir dos números''
 +
  std::cin >>n1 >>n2;                                    // Tomando del canal de entrada los datos en el orden indicado.
 +
  std:: cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << std::endl; // Muestra por el canal de salida,
 +
                                                                                  // el string de mostrar la suma.
 +
  return 0;
 +
}
 +
</syntaxhighlight>
 +
Hay que cuidar el tipo de directivas que se estén incluyendo en nuestro programa, y la manera en que se estén introduciendo, ya que esto puede ayudar al programador a reducir líneas de código o incluso hacer el código mas cómodo a la hora de revisar procedimientos. Por ejemplo, si se incluye la libreria <iostream> sin la extensión ''.h'' es '''necesario''' escribir los espacios de nombres ''std::'' como en el ejemplo anterior. De introducir la directiva <iostream'''.h'''> no es necesario colocar los espacios de nombres ''std::''. Ahora bien, existen también mas combinaciones para lograr la mayor comodidad para el programador, como por ejemplo, agregar <iostream> seguido de la directiva ''using'', la cual permite disponer las definiciones de iostream en el programa.
 +
<syntaxhighlight lang="C">
 +
#include <iostream>
 +
using namespace std;
 +
 +
int main()
 +
{
 +
  int n1, n2;
 +
  cout<< "Introducir dos números:" << endl;        // Indicando de salida el string o línea de caracteres ''Introducir dos números''
 +
  cin >>n1 >>n2;                                    // Tomando del canal de entrada los datos en el orden indicado.
 +
  cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << endl; // Muestra por el canal de salida, el string de mostrar la suma.
 +
  return 0;
 +
}
 +
 +
</syntaxhighlight>
 +
Para efectos prácticos de este artículo, se configurará a continuación el ''Visual Studio 2012'' para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.
 +
 +
==Configurar Visual Studio 2010 con pthreads (Posix Threads)==
 +
En primera instancia, se debe tener Visual Studio 2010 instalado en la computadora donde se trabajará. Lo siguiente es descargar estos [https://www.dropbox.com/s/pl2qghdiu8nswtz/Archivos%20pthreads.rar '''Archivos para PThreads - Windows'''], los cuales incluyen las “librerías” e “includes” necesarios.
 +
 +
===Creando Proyecto App Win32===
 +
Después de instalar lo anterior, lo siguiente será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Para realizar esto se tienen dos formas, la primera es hacer click en la opción “New Project” en el Start Page (Nuevo Proyecto en su defecto), la segunda es buscar en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación ''crtl+shift+n''.
  
Lo siguiente que se quiere hacer, es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto ('''¡¡¡Tomar nota!!!'''), y presionamos la tecla aceptar.  
+
Lo siguiente que se quiere hacer es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto ('''¡¡¡Tomar nota!!!'''), y presionamos la tecla aceptar.  
  
'''Nota:''' De estar trabajando en una computadora ubicada en el Laboratorio C, crear el proyecto en la carpeta Temp con un nombre especifico, para que de esa manera no sea eliminada por el personal.
+
'''Nota:''' Cabe resaltar en este punto, que de estar trabajando en laboratorio (LabC) se debe ubicar la carpeta del proyecto en cuestión, en la carpeta c:/temp. De esta manera, se asegura por el trimestre que el proyecto no sea eliminado.
  
//////Imágenes/////
+
{|
 +
| [[File:1_AbrirProyecto.png|thumb|350px|left|Creando proyecto]]
 +
| [[File:2_NombreProyecto.png|thumb|350px|left|Ubicación y nombre]]
 +
|}
  
 
En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.
 
En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.
  
//////Imágenes/////
+
{|
 +
| [[File:2.4_Select_win32_console_app.png|350px|thumb|upright|Buscador]]
 +
|}
 +
 
 +
Continuando con la configuración del proyecto, nos topamos con el asistente de creación de proyecto, marcamos la opción de Crear proyecto vacío, quedando de la siguiente manera:
  
Continuando con la configuración del proyecto, nos topamos con el asistente de aplicaciones Win32. En dicha ventana presionamos Siguiente, llevando a la configuración de aplicaciones, donde se escogerán las siguientes opciones:
 
 
*'''''Tipo de aplicación:'''''
 
*'''''Tipo de aplicación:'''''
 
**''Aplicación de consola''
 
**''Aplicación de consola''
Línea 78: Línea 192:
  
 
'''Nota:''' Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.
 
'''Nota:''' Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.
//////Imágenes/////
+
 
 +
{|
 +
| [[File:3_Asistente1.png|thumb|350px|left|Configurando proyecto 1]]
 +
| [[File:3_Asistente2.png|thumb|350px|right|Configurando proyecto 2]]
 +
|}
  
 
===Archivo de Código Fuente===
 
===Archivo de Código Fuente===
 
Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item”  (Agregar -> Nuevo elemento) ''Ctrl + Shift  + A''.
 
Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item”  (Agregar -> Nuevo elemento) ''Ctrl + Shift  + A''.
  
//////Imágenes/////
+
{|
 +
| [[File:4_AgregarCodigo.png|thumb|350px|left|Agregando códigos fuentes 1.]]
 +
| [[File:5_AgregarNuevoElementoCodigoFuente.png|thumb|350px|right|Agregando códigos fuentes 2.]]
 +
|}
  
 
En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.
 
En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.
  
//////Imágenes/////
+
'''Nota:''' Cabe recordar que el lenguaje de programación C++ (y Visual C++ en su defecto), aceptan las extensiones .c del lenguaje C, por lo tanto, el introducir un código en C, no afectará en nada, siempre y cuando se estén agregando las librerías que se estén usando en dicho código.
  
Aquí es donde se agregará el código realizado.
+
{|
 +
| [[File:6_AgregarNuevoElementoCodigoFuente_2.png‎|thumb|350px|right|Agregando códigos fuentes 3.]]
 +
|}
 +
 
 +
 
 +
En la nueva vista de la pantalla principal del Visual Studio, es donde se incluirá el código del usuario
  
 
=== Agregando Librerias de PThreads ===
 
=== Agregando Librerias de PThreads ===
Interesa en este punto de la configuración tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto.  
+
En este punto de la configuración, es de interés tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto.  
 +
 
 +
{|
 +
| [[File:8_Descargar_libreria_4.png|thumb|350px|left|Agregando archivos pthreads.]]
 +
| [[File:8_Descargar_libreria_5.png|thumb|350px|right|Agregando archivos pthreads.]]
 +
|}
 +
 
 
Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación ''Alt + Enter'', teniendo seleccionado el panel de Explorador de Soluciones.
 
Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación ''Alt + Enter'', teniendo seleccionado el panel de Explorador de Soluciones.
  
 +
{|
 +
| [[File:9_PropiedadesProyecto.png|thumb|350px|left|Agregando PThreads lib's 1.]]
 +
|}
  
 
Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”.  
 
Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”.  
  
///// Imágenes //////
+
{|
 +
| [[File:10_PropiedadesProyecto2.png|thumb|350px|left|Agregando PThreads lib's 1.]]
 +
| [[File:11_PropiedadesProyecto3.png|thumb|350px|left|Agregando PThreads lib's 2.]]
 +
|}
  
 
Ubicamos las distintas carpetas en cada uno de los 3 casos:
 
Ubicamos las distintas carpetas en cada uno de los 3 casos:
Línea 113: Línea 251:
 
Quedando de la siguiente manera:
 
Quedando de la siguiente manera:
  
///// Imagen //////
+
{|
 +
| [[File:13_PropiedadesProyecto5.png|thumb|350px|left|Agregando PThreads lib's 3.]]
 +
|}
  
 
Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:
 
Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:
Línea 121: Línea 261:
 
'''Nota:''' Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.
 
'''Nota:''' Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.
  
///// Imagen //////
+
{|
 +
| [[File:14_PropiedadesProyecto6.png|350px|left|Agregando PThreads lib's 4.]]
 +
|}
  
 
Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.
 
Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.
 +
 +
Ahora es necesario agregar el archivo pthreadVC2.dll en la carpeta debug de nuestro proyecto, en caso de presentar error, colocar este archivo también en la carpeta de system32 (Para este ultimo paso necesitaras permiso de administrador).
  
 
Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página
 
Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página
 
[http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Linux Tutorial PThreads]
 
[http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html Linux Tutorial PThreads]
  
===Shortcuts de interés===
+
 
 +
'''Código:'''
 +
<syntaxhighlight lang="C">
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <pthread.h> /* Incluir la librería que acabamos de añadir*/
 +
#include <semaphore.h> /* Se necesita incluir esta librería si se desea trabajar con los semáforos*/
 +
 +
    void *imprimir_mensaje( void *ptr );
 +
 +
    int main()
 +
    {
 +
    pthread_t hilo1, hilo2;
 +
    char *mensaje1 = "Soy el Hilo 1";
 +
    char *mensaje2 = "Soy el Hilo 2";
 +
    int ret1, ret2;
 +
 +
        /* Crear dos hilos independientes cada uno va a ejecutar la funcion*/
 +
    ret1 = pthread_create( &hilo1, NULL, imprimir_mensaje, (void*) mensaje1);
 +
    ret2 = pthread_create( &hilo2, NULL, imprimir_mensaje, (void*) mensaje2);
 +
        /* Esperar a que los hilos terminen antes que continue el main. Unless we */
 +
        /* Si no esperamos se corre el riesgo de ejecutar un exit() el cual */
 +
        /* finalizaria el proceso y todos los hilos antes de que terminen. */
 +
    pthread_join( hilo1, NULL);
 +
    pthread_join( hilo2, NULL);
 +
    printf("Hilo 1 Valor de retorno: %d\n",ret1);
 +
    printf("Hilo 2 Valor de retorno: %d\n",ret2);
 +
    exit(0);
 +
    }
 +
 +
    void *imprimir_mensaje( void *ptr )
 +
    {
 +
    char *mensaje;
 +
    mensaje = (char *) ptr;
 +
    printf("%s \n", mensaje);
 +
    return 0;
 +
    }
 +
</syntaxhighlight>
 +
'''Nota:'''
 +
Si necesita visualizar información en el terminal ( printf ), es necesario correr el programa utilizando '''CTRL-F5''', de lo contrario apenas termine de ejecutarse el programa se cerrará la ventana de terminal y no se podrá apreciar lo impreso en pantalla.
 +
 
 +
De lo contrario, antes de '''return 0;''' puede escribirse '''system("pause");''' y el programa pedirá que se presione una tecla para cerrar.
 +
 
 +
===''Shortcuts'' de Interés===
 
*'''''Crear nuevo proyecto:''' (Ventana activa: Principal)''
 
*'''''Crear nuevo proyecto:''' (Ventana activa: Principal)''
 
**''Ctrl + Shift + N''
 
**''Ctrl + Shift + N''
 
*'''''Añadir nuevo elemento:''' (Ventana activa: Explorador de soluciones)''
 
*'''''Añadir nuevo elemento:''' (Ventana activa: Explorador de soluciones)''
 
**''Ctrl + Shift + A''
 
**''Ctrl + Shift + A''
*'''''Propiedades de proyecto:''' (Ventana activa: Explorador de soluciones)''
+
*'''''Propiedades del proyecto:''' (Ventana activa: Explorador de soluciones)''
 
**''Alt + Enter''
 
**''Alt + Enter''
*'''''Contruir proyecto:''' (Ventana activa: principal)''
+
*'''''Construir proyecto:''' (Ventana activa: principal)''
 
**''Ctrl + Shift + B''
 
**''Ctrl + Shift + B''
 
*'''''Correr con debug:''' (Ventana activa: principal)''
 
*'''''Correr con debug:''' (Ventana activa: principal)''
Línea 141: Línea 328:
 
*'''''Correr SIN debug:''' (Ventana activa: principal)''
 
*'''''Correr SIN debug:''' (Ventana activa: principal)''
 
**''Ctrl + F5''
 
**''Ctrl + F5''
 +
*'''''Step over'''''
 +
**''F10''
 +
*'''''Step into'''''
 +
**''F11''
 +
*'''''Step out'''''
 +
**''Shift + F10''
  
 
==Referencias==
 
==Referencias==
 
*[http://books.google.com/books?id=_xvnuFzo7q0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false '''Programming with POSIX threads.''' ''David R. Butenhof'']
 
*[http://books.google.com/books?id=_xvnuFzo7q0C&printsec=frontcover&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false '''Programming with POSIX threads.''' ''David R. Butenhof'']
*'''Tutorial de configuración de Visual Studio 2010 con Posix Threads.''' ''Raúl Acuña''
+
*[https://www.dropbox.com/s/5o2yzfxtqmig7y7/TutorialVisualStudio2010conPosixThreads.pdf '''Tutorial de configuración de Visual Studio 2010 con Posix Threads.''' ''Raúl Acuña'']
 
+
*Joyanes Aguilar, L; Zahonero Martínez, I. ''Programación en C, C++, Java y UML''. McGrawHill (2010)
 +
*[http://www.cplusplus.com/ '''Información de C++: cplusplus.com''']
  
 
Aún falta. Es para ir viendo como va quedando
 
Aún falta. Es para ir viendo como va quedando
Línea 151: Línea 345:
  
  
****************************************************************************************************************
+
Gustavo Rivera - 09-10717
****************************************************************************************************************
+
****************************************************************************************************************
+
 
+
NOTA! Es igual que el VS 2012, porque me copie el articulo para tenerlo de base!!!
+
 
+
****************************************************************************************************************
+
****************************************************************************************************************
+
****************************************************************************************************************
+
 
+
 
+
Gustavo Rivera
+
 
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]
 
[[Categoría: EC3731 - Arquitectura del Computador 2]][[Categoría: Sistemas Operativos]]

Revisión actual del 12:30 3 dic 2012

En el siguiente artículo, se pretende ayudar al usuario a crear y configurar un proyecto en Visual Studio 2010, con el fin de trabajar con los hilos POSIX usando el lenguaje de programación C++. Esto nos brindará la posibilidad de trabajar con hilos de una manera amplia, cumpliendo los estandares POSIX, como tambien rutinas de sincronización.

Para mayor información sobre estos últimos, consulte la sección de referencias ubicada al final del artículo.

Visual Studio 2010

Datos de programa
Microsoft Visual Studio 2010
Desarrollador
Página oficial de Microsoft Visual Studio
Información General
Fecha de Lanzamiento: 12 Abril 2010
Género: IDE
OS: Windows 32 o 64-bits
Licencia estudiantil: Alianza USB-Microsoft

Posix Threads

Los PThreads, o Posix Threads, es un estandar de POSIX para el control de hilos en un programa, o extensión. Mas específicamente, el estandar POSIX.1c (Extensiones de hilos), define un API para la creación y la manipulación de los hilos.

Existen alrededor de 100 procedimientos de este estandar, los cuales pueden ser categorizados en 4 grupos principales:

  • Manejadores de Hilos
  • Variables con condiciones
  • Sincronización
  • Mutex

Lamentablemente, para los usuarios de Windows, no hay una compatibilidad directa con este tipo de estándares, a diferencia de Linux, MAC OS X,FreeBSD, OpenBSD, Solaris, entre otros. Para ello, se han creado librerías y paquetes independientes para brindarle a Windows y DR-DOR, la compatibilidad necesaria.

Nota: En la sección Configurar Visual Studio 2012 con pthreads (Posix Threads) se encuentra un comprimido con un paquete específico con el cual se podrá trabajar usando Visual Studio. Mas adelante, se explica con detenimiento como configurar dichos archivos.

C++

C++ (C más más) es un lenguaje de programación, se puede considerar un lenguaje híbrido, que surgió como extensión del lenguaje de programación C a mediados de los 80. Dicho lenguaje, aporta mecanismos de programación orientada a objetos, como classes y definiciones de nuevos tipos de datos no incluidos en C, como wchar_t, permitiendo trabajar con caracteres UNICODE.

Tipos aritméticos en C++
Tipo Significado Tamaño mínimo
bool boolean(lógico) --
char carácter 8bits
wchar_t carácter ancho 16bits
short enter-corto 16bits
int entero 16bits
long largo-entero 32bits
float real precisión simple ~7 dígitos significativos
double real precisión doble ~15 dígitos significativos
long double real precisión doble extendido ~15 dígitos significativos


Hay que tener en cuenta, para los casos en los que se trabaje E/S (Entradas y Salidas) con el lenguaje de programación C++, se debe incluir la directiva o biblioteca estándar <iostream> que llegaría a ser el equivalente al stdio en C.

 #include <iostream>

Nótese, que no es necesario colocar .h en este formato, gracias a los nuevos tipos de archivos cabezera de ANSI implementados en dicho lenguaje.

Dentro de esta directiva, se encuentran 2 tipos de representaciones tanto para la entrada como para la salida, istream y ostream respectivamente, en los cuales se definen los símbolos de transmisión y recepción de datos:

std:: cin Canal de entrada estándar
std:: cout Canal de salida estándar
std:: cerr Canal de salida de error
std:: endl Símbolo para avance de línea

La entrada se realiza de manera estándar, a través de un canal como el teclado. La salida, tanto de dato como errores, se realiza de manera estándar, generalmente por pantalla. Estos canales tanto de entrada como de salida, son los que generalmente se usan, aunque pueden ser redirigidos los datos a otro canal capaz de transmitir o recibir datos, ya sea por sistema operativo o funciones de sistema.

Para poder dirigir un dato por el canal de salida, se ha de usar el operador <<, mientras que para entrada, >>. Incluso, se puede llegar a encadenar múltiples salidas o entradas, por ejemplo, el trozo de código:

 ''std:: cout << "Nací el día" << v_dia << "del mes" << v_mes << "del año" << v_agno << std::endl;'' (Siendo v_dia, v_mes y v_agno, las
 respectivas variables)

Dicho formato también aplica para introducir múltiples entradas.

Código ejemplo:

 #include <iostream>
 
 int main()
 {
   int n1, n2;
   std::cout<< "Introducir dos números:" << std:: endl;   // Indicando de salida el string o línea de caracteres ''Introducir dos números''
   std::cin >>n1 >>n2;                                    // Tomando del canal de entrada los datos en el orden indicado.
   std:: cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << std::endl; // Muestra por el canal de salida, 
                                                                                   // el string de mostrar la suma.
   return 0;
 }

Hay que cuidar el tipo de directivas que se estén incluyendo en nuestro programa, y la manera en que se estén introduciendo, ya que esto puede ayudar al programador a reducir líneas de código o incluso hacer el código mas cómodo a la hora de revisar procedimientos. Por ejemplo, si se incluye la libreria <iostream> sin la extensión .h es necesario escribir los espacios de nombres std:: como en el ejemplo anterior. De introducir la directiva <iostream.h> no es necesario colocar los espacios de nombres std::. Ahora bien, existen también mas combinaciones para lograr la mayor comodidad para el programador, como por ejemplo, agregar <iostream> seguido de la directiva using, la cual permite disponer las definiciones de iostream en el programa.

 #include <iostream>
 using namespace std;
 
 int main()
 {
   int n1, n2;
   cout<< "Introducir dos números:" << endl;         // Indicando de salida el string o línea de caracteres ''Introducir dos números''
   cin >>n1 >>n2;                                    // Tomando del canal de entrada los datos en el orden indicado.
   cout << "La suma de " << n1 << "+" << n2 << "es" << n1 + n2 << endl; // Muestra por el canal de salida, el string de mostrar la suma.
   return 0;
 }

Para efectos prácticos de este artículo, se configurará a continuación el Visual Studio 2012 para trabajar con C++ y sus respectivas extensiones, debido a su fácil uso y relación con el lenguaje de programación C.

Configurar Visual Studio 2010 con pthreads (Posix Threads)

En primera instancia, se debe tener Visual Studio 2010 instalado en la computadora donde se trabajará. Lo siguiente es descargar estos Archivos para PThreads - Windows, los cuales incluyen las “librerías” e “includes” necesarios.

Creando Proyecto App Win32

Después de instalar lo anterior, lo siguiente será crear un proyecto nuevo en Visual Studio, con la configuración Visual C++. Para realizar esto se tienen dos formas, la primera es hacer click en la opción “New Project” en el Start Page (Nuevo Proyecto en su defecto), la segunda es buscar en la pestaña “FILE” o “ARCHIVO” -> “new” (nuevo) -> “Project” (proyecto). Para un acceso más rápido también puede presionar la combinación crtl+shift+n.

Lo siguiente que se quiere hacer es configurar el proyecto nuevo como una Aplicación de Consola Win32. Para ello, en la ventana que emergió anteriormente, ubicamos del lado izquierdo, Templates -> Visual C++ -> Win32 Console Application (Aplicación de consola Win32). Le asignamos nombre y ubicación al proyecto (¡¡¡Tomar nota!!!), y presionamos la tecla aceptar.

Nota: Cabe resaltar en este punto, que de estar trabajando en laboratorio (LabC) se debe ubicar la carpeta del proyecto en cuestión, en la carpeta c:/temp. De esta manera, se asegura por el trimestre que el proyecto no sea eliminado.

Creando proyecto
Ubicación y nombre

En caso de no encontrar de manera manual el tipo de proyecto, uno siempre se puede apoyar en el buscador, ubicado en la esquina superior izquierda de dicha ventana.

Buscador

Continuando con la configuración del proyecto, nos topamos con el asistente de creación de proyecto, marcamos la opción de Crear proyecto vacío, quedando de la siguiente manera:

  • Tipo de aplicación:
    • Aplicación de consola
  • Opciones adicionales:
    • Proyecto vacío.

Nota: Dependiendo de los usos y fines de nuestro proyecto, estas opciones pueden variar, e incluso llevar a mas configuraciones. Para el caso actual, esas opciones no son de interés.

Configurando proyecto 1
Configurando proyecto 2

Archivo de Código Fuente

Ya con el proyecto creado, procedemos a agregar el archivo fuente de nuestro proyecto. Para ello, nos ubicamos en la carpeta Sources (Archivos de código fuente, o, Fuentes), que por defecto se encuentra en la parte derecha de nuestra pantalla. Damos click derecho, y abrimos el camino “Add -> New Item” (Agregar -> Nuevo elemento) Ctrl + Shift + A.

Agregando códigos fuentes 1.
Agregando códigos fuentes 2.

En la nueva ventana, seleccionamos el tipo de archivo “C++ File (.cpp)” (Archivo C++ (.cpp)) y lo nombramos “main.cpp” en la parte de debajo de la presente pantalla. Damos click, en agregar.

Nota: Cabe recordar que el lenguaje de programación C++ (y Visual C++ en su defecto), aceptan las extensiones .c del lenguaje C, por lo tanto, el introducir un código en C, no afectará en nada, siempre y cuando se estén agregando las librerías que se estén usando en dicho código.

Agregando códigos fuentes 3.


En la nueva vista de la pantalla principal del Visual Studio, es donde se incluirá el código del usuario

Agregando Librerias de PThreads

En este punto de la configuración, es de interés tener listos los archivos de librerías e includes, descargados al inicio del artículo. Para ello, se copiará la carpeta pthread (ubicada dentro de x86) en una carpeta, preferiblemente, junto a la carpeta del proyecto en cuestión. Lo siguiente será vincular dichos archivos al proyecto.

Agregando archivos pthreads.
Agregando archivos pthreads.

Ubicamos el nombre de nuestro proyecto, en el Explorador de Soluciones, justo debajo de Solución ‘nombredelproyecto’. Damos click derecho, y ubicamos “Properties” (Propiedades) o también, podemos acceder con la combinación Alt + Enter, teniendo seleccionado el panel de Explorador de Soluciones.

Agregando PThreads lib's 1.

Una vez, dentro de la ventana de propiedades, ubicamos en el panel izquierdo “VC++ Directories” (Directorios VC++), y ahí los 3 directorios “Executable Directories”, “Include Directories” y “Library Directories” (Directorio de Archivos Ejecutables, Inclusión y bibliotecas respectivamente) donde vamos a seleccionar la ubicación de los archivos descargados. Seleccionamos uno de ellos, y damos click a la flecha lateral que aparece en la dirección de los archivos actualmente seleccionados y presionamos editar. De ahí, nos aparece una nueva ventana. Presionamos el botón de la carpeta, seguido de los “…”.

Agregando PThreads lib's 1.
Agregando PThreads lib's 2.

Ubicamos las distintas carpetas en cada uno de los 3 casos:

Archivos ejecutables:
  pthread -> lib
Archivos de inclusión:
  pthread -> include
Archivos de bibliotecas:
  pthread -> lib

Quedando de la siguiente manera:

Agregando PThreads lib's 3.

Por último, vamos a la sección “Linker -> Input” (Vinculador -> Entrada) en el panel izquierdo. Ubicamos “Additional Dependencies” (Dependencias adicionales), y para efectos prácticos de este artículo, SÓLO agregamos antes de kernel32.lib lo siguiente:

  • pthreadVC2.lib;

Nota: Recordar poner el “;” <<Punto y coma>> después de cada dependencia agregada, además del tipo de archivo que se está agregando. De tener cualquier dependencia adicional, necesaria para el programa o aplicación en cuestión ha de agregarse en esta sección.

Agregando PThreads lib's 4.

Una vez terminado, presionamos "Aplicar" luego "Aceptar", regresando a la pantalla principal de Visual Studio.

Ahora es necesario agregar el archivo pthreadVC2.dll en la carpeta debug de nuestro proyecto, en caso de presentar error, colocar este archivo también en la carpeta de system32 (Para este ultimo paso necesitaras permiso de administrador).

Ya con estos pasos, Visual Studio queda configurado para trabajar con lo básico de Hilos Posix, quedando pendiente probar los códigos. Dentro del comprimido descargado al principio del artículo se encuentra en un bloc de notas, un código de prueba, sacado de la página Linux Tutorial PThreads


Código:

 #include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h> /* Incluir la librería que acabamos de añadir*/
 #include <semaphore.h> /* Se necesita incluir esta librería si se desea trabajar con los semáforos*/
 
    void *imprimir_mensaje( void *ptr );
 
    int main()
    {
     pthread_t hilo1, hilo2;
     char *mensaje1 = "Soy el Hilo 1";
     char *mensaje2 = "Soy el Hilo 2";
     int ret1, ret2;
 
         /* Crear dos hilos independientes cada uno va a ejecutar la funcion*/
     ret1 = pthread_create( &hilo1, NULL, imprimir_mensaje, (void*) mensaje1);
     ret2 = pthread_create( &hilo2, NULL, imprimir_mensaje, (void*) mensaje2);
        /* Esperar a que los hilos terminen antes que continue el main. Unless we */
        /* Si no esperamos se corre el riesgo de ejecutar un exit() el cual */
        /* finalizaria el proceso y todos los hilos antes de que terminen. */
     pthread_join( hilo1, NULL);
     pthread_join( hilo2, NULL);
     printf("Hilo 1 Valor de retorno: %d\n",ret1);
     printf("Hilo 2 Valor de retorno: %d\n",ret2);
     exit(0);
    }
 
    void *imprimir_mensaje( void *ptr )
    {
     char *mensaje;
     mensaje = (char *) ptr;
     printf("%s \n", mensaje);
     return 0;
    }

Nota: Si necesita visualizar información en el terminal ( printf ), es necesario correr el programa utilizando CTRL-F5, de lo contrario apenas termine de ejecutarse el programa se cerrará la ventana de terminal y no se podrá apreciar lo impreso en pantalla.

De lo contrario, antes de return 0; puede escribirse system("pause"); y el programa pedirá que se presione una tecla para cerrar.

Shortcuts de Interés

  • Crear nuevo proyecto: (Ventana activa: Principal)
    • Ctrl + Shift + N
  • Añadir nuevo elemento: (Ventana activa: Explorador de soluciones)
    • Ctrl + Shift + A
  • Propiedades del proyecto: (Ventana activa: Explorador de soluciones)
    • Alt + Enter
  • Construir proyecto: (Ventana activa: principal)
    • Ctrl + Shift + B
  • Correr con debug: (Ventana activa: principal)
    • F5
  • Correr SIN debug: (Ventana activa: principal)
    • Ctrl + F5
  • Step over
    • F10
  • Step into
    • F11
  • Step out
    • Shift + F10

Referencias

Aún falta. Es para ir viendo como va quedando blah.


Gustavo Rivera - 09-10717