2009-11-10 13 views
10

Soy un principiante en Stack Overflow. Estoy trabajando en una plataforma Unix en C/C++. Conociendo la programación básica en estos aspectos, ¿cómo podría comenzar con multithreading?¿Cómo empiezo a usar la programación multiproceso?

El subprocesamiento múltiple parece ser muy interesante y quiero aumentar mis conocimientos al respecto.

¿Cómo podría comenzar con el subprocesamiento múltiple y cuáles son las mejores técnicas/libros/libros electrónicos/artículos disponibles para captar los conceptos lo antes posible?

+1

Buenas respuestas a continuación. Temía que obtuvieras muchísimo "usa ESTA API. ¡¡¡Es zeh beeeeeeeeessst !!" pero el punto más importante es lo que voy a reiterar aquí: la API utilizada es irrelevante. La mayoría de los conceptos se aplican independientemente de la API. Lea algunos de los recursos publicados a continuación. Elija un problema que cree que podría paralizar, luego pruébelo. –

+1

Hagas lo que hagas, comienza con una API de ** alto nivel **. Aprenda cómo hacer las cosas justo antes de aprender cómo funciona en detalle. –

+0

@static_rtti ¿hasta qué punto? no se puede evitar entender los fundamentos del punto muerto y la exclusión mutua. Algunas API de nivel inferior facilitan esta comprensión más que las de nivel más alto que hacen todo el bloqueo una vez que ingresas al alcance de un monitor. Le recomendaría que empiece con el que le parezca más lógico, en lugar de preocuparse por si es de nivel alto o bajo. Además, habrá quienes discuten en su contra, diciendo que hasta que sepa los detalles, entonces NO sabe cómo hacerlo bien. Tu comentario no fue realmente útil en ningún aspecto. –

Respuesta

1

creo que el artículo de Wikipedia Multithreading le dan una visión rápida y siguiendo los enlaces externos que obtendrá una buena visión general del tema. Después de eso, o adicionalmente, puede leer el Operating Systems: Design and Implementation de Tanenbaum (gran libro por cierto). Pero lo más importante es, en mi opinión, tenerlo en tus manos. Tan solo descargue una aplicación de ejemplo de ... digamos The Code Project o cualquier sitio web que encuentre y juegue con él. Vea cómo difiere la aplicación si usa bloqueos o qué sucede si dos subprocesos intentan acceder al mismo recurso y con qué frecuencia esto ocurrirá, etc. Con eso creo que lo entenderá bastante rápido. Y es divertido evaluar y jugar con técnicas que son nuevas para uno mismo.

6

aprendizaje de la programación multi-threading tiene dos partes:

  1. cómo escribir aplicaciones de múltiples subprocesos
  2. cómo utilizar la API disponible (pthread)

aprendizaje de la programación multi-hilo es más difícil, Este es un buen artículo publicado en el Linux Journal que lo ayudará a comprender los principios básicos.

Para comprender mejor Pthreads Sugiero leer este tutorial - POSIX Threads Programming

También hay un buen libro por o'rielly llamada PThreads Programming

+0

Estoy de acuerdo con el libro O'Rielly ... Realmente aclaré mi comprensión de la programación multiproceso leyéndolo, aunque terminé usando un marco para ayudar con algunos de los detalles en C++. –

0

Tal vez un poco controvertido, pero realmente multihilo cklicked para mí cuando intenté resolver un rompecabezas de codificación una vez.

El enigma consistía en escribir código seguro para hilos sin usar mutexes. Mis primeros intentos fueron miserables, pero cuando finalmente lo conseguí, fue como aprender a andar en bicicleta. Desde entonces, nunca me había sentido inseguro sobre la concurrencia.

Algunas veces incluso me he topado con programadores que han leído libros sobre el tema, pero no entiendo cosas simples como el hecho de que una tarea primitiva a veces puede no ser una operación atómica.

+0

"una asignación primitiva a veces puede no ser una operación atómica." muchos no saben que la cesión no podrá ser ejecutado en el orden como está escrito en el código y puede de hecho ser reordenados por el compilador que puede causar complicaciones.Me gustan los artículos esclarecedores de Herb Sutter, Scott Meyers y Andrei Alexandrescu al respecto. – Modicom

+0

¿La solución del rompecabezas era un diseño sin cerradura, o usaba un mecanismo de bloqueo (como el algoritmo de Dekker) distinto de un mutex (AKA dijkstra)? si fuera un tipo de solución sin bloqueo, ¿le importaría publicar el problema y la solución de alguna manera? –

+0

@San Jancinto: en realidad no recuerdo esos detalles sobre el rompecabezas. También me arrepiento de no haberlo guardado en ese momento, esto fue hace unos 8-9 años y el foro donde se publicó ya no existe. – sharkin

0

Todo depende de sus objetivos. Hay un montón de código y artículos con problemas comunes de multi-threading resueltos basados ​​en el framework de threads POSIX (veo el número de recomendaciones de buenos artículos aquí).La pregunta principal es qué quieres construir. Para algunas tareas, no se recomienda realizar multihebras en absoluto.

Aquí está el libro "Foundations of Multithreaded, Parallel, and Distributed Programming" que está relacionado con el tema discutido y lo que me gustaría recomendar. La ventaja más significativa de esto es su estilo "relativamente fácil de leer", pero no existe un vínculo fuerte con la ideología de los hilos POSIX (que es un problema común).

2

Si estás empezando con múltiples hilos, mi consejo sería primer examen y una mejor comprensión de E/S en el sistema. Comprender el bloqueo frente a la E/S sin bloqueo, la señalización, las rutinas asíncronas, las devoluciones de llamada, etcétera. La E/S es probablemente una razón, si no la principal, para agregar subprocesamiento múltiple a sus programas. Con ese conocimiento, puede elegir un libro en subprocesos o subprocesos Java, o concentrarse en la biblioteca de subprocesos Boost u otra biblioteca de subprocesos para su tecnología favorita.

0

dado que es UNIX ¿por qué no comenzar con los procesos y las comunicaciones IPC? es decir, colas de mensajes, memoria compartida y mutexes.

0

el estudio de diversos marcos de la biblioteca y las instalaciones de O/S es una buena manera de entender la concurrencia de bajo nivel. Los ejemplos que encuentre allí pueden ayudarle a comenzar a escribir código simultáneo en un corto período de tiempo.

Después de depurar el camino a través de unos puntos muertos y los problemas de corrupción de memoria compartida, usted encontrará que usted necesita algunas herramientas para razonar acerca de sus problemas y descomposición de concurrencia. Personalmente me gusta el artículo de Herb Sutter The Pillars of Concurrency como punto de partida. La idea es comprender mejor por qué necesita concurrencia. ¿Estás buscando un tiempo de respuesta mejorado, un cálculo paralelo, una combinación de razones?

Comprender el "por qué" lo llevará a un mejor "qué". A partir de ahí siempre se puede araña a diferentes enfoques de bajo nivel: Active Objects, monitor objects, message passing, etc. Como dijiste, hay mucho que saber en este campo.

1

yo encontramos este tutorial muy informativo y claramente por escrito. Espero que sea útil.

Cuestiones relacionadas