¿Hay alguna manera de que este problema pueda beneficiarse de una solución con múltiples hilos, en lugar de un solo hilo?
En una entrevista, me pidieron que resolviera un problema usando múltiples hilos. Me parece que los múltiples hilos no brindan ningún beneficio.
Aquí está el problema:
Te dan un párrafo, que contiene n número de palabras, te dan m hilos. Lo que debe hacer es, cada hilo debe imprimir una palabra y dar el control al siguiente hilo, de esta manera cada hilo seguirá imprimiendo una palabra, en caso de que llegue el último hilo, debe invocar el primer hilo. La impresión se repetirá hasta que todas las palabras se impriman en un párrafo. Finalmente todos los hilos deben salir con gracia. ¿Qué tipo de sincronización usará?
Creo firmemente que no podemos aprovechar los hilos aquí, pero creo que el entrevistador está tratando de medir mis habilidades de sincronización. ¿Me estoy perdiendo algo en este problema que haría que varios hilos tengan valor?
No necesita código, solo piense. Lo implementaré por mí mismo.
fuente
Respuestas:
Me parece que te están guiando hacia una solución de semáforo. Los semáforos se utilizan para indicar a otro hilo que es su turno. Se usan con mucha menos frecuencia que los mutexes, por lo que creo que es por eso que piensan que es una buena pregunta para la entrevista. También es por qué el ejemplo parece artificial.
Básicamente,
m
crearías semáforos. Cada hilox
espera en el semáforo yx
luego se publica en el semáforox+1
después de hacer lo suyo. En pseudocódigo:fuente
En mi opinión, esta es una pregunta fabulosa para la entrevista: al menos suponiendo que (1) se espera que el candidato tenga un conocimiento profundo de los hilos, y (2) el entrevistador también tiene un conocimiento profundo y está usando la pregunta para sondear al candidato. Siempre es posible que el entrevistador buscara una respuesta específica y estrecha, pero un entrevistador competente debería buscar lo siguiente:
Este último punto es, en mi opinión, el más importante. Nuevamente, según mi experiencia, se vuelve exponencialmente más difícil depurar el código enhebrado si el subproceso se mezcla con la lógica de la aplicación (solo mire todas las preguntas de Swing en SO para ver ejemplos). Creo que el mejor código de subprocesos múltiples está escrito como un código de subprocesos único autónomo, con transferencias claramente definidas.
Con esto en mente, mi enfoque sería dar a cada hilo dos colas: una para entrada y otra para salida. El hilo se bloquea mientras lee la cola de entrada, quita la primera palabra de la cadena y pasa el resto de la cadena a su cola de salida. Algunas de las características de este enfoque:
Dicho esto, todavía hay muchas áreas grises que un entrevistador competente puede investigar:
Finalmente, si tiene experiencia en programación concurrente, podría hablar sobre algunos marcos (por ejemplo, Akka para Java / Scala) que ya siguen este modelo.
fuente
Las preguntas de la entrevista a veces son preguntas engañosas, destinadas a hacerte pensar sobre el problema que estás tratando de resolver. Hacer preguntas sobre una pregunta es una parte integral de abordar cualquier problema, ya sea en el mundo real o en una entrevista. Hay una serie de videos que circulan por Internet sobre cómo abordar las preguntas en entrevistas técnicas (busque particularmente Google y quizás Microsoft).
Acercarse a entrevistas con este patrón de pensamiento lo llevará a bombardear cualquier entrevista para cualquier empresa por la que valga la pena trabajar.
Si no crees que ganas mucho (si es que hay algo de subprocesos), diles eso. Dígales por qué no cree que haya ningún beneficio. Ten una discusión con ellos. Las entrevistas técnicas están destinadas a ser una plataforma de discusión abierta. Puede terminar aprendiendo algo sobre cómo puede ser útil. No siga adelante a ciegas tratando de implementar algo que su entrevistador le dijo que hiciera.
fuente
Primero tokenice el párrafo con delimitadores apropiados y agregue las palabras a una Cola.
Cree N número de subprocesos y manténgalo en un grupo de subprocesos.
Itere sobre el grupo de subprocesos e inicie el subproceso y espere a que el
subproceso se una. Y comience el siguiente hilo una vez que termine el primer hilo y así sucesivamente.
Cada subproceso solo debe sondear la cola e imprimirla.
Una vez que todos los hilos se usan dentro del grupo de hilos, comience desde el principio del grupo.
fuente
Como dijiste, no creo que este escenario se beneficie mucho, si es que lo hace, del enhebrado. Es más probable que sea más lento que una implementación de subproceso único.
Sin embargo, mi respuesta sería tener cada hilo en un bucle cerrado intentando acceder a un bloqueo que controla el acceso al índice de matriz de palabras. Cada hilo agarra el bloqueo, obtiene el índice, obtiene la palabra correspondiente de la matriz, la imprime, incrementa el índice y luego libera el bloqueo. Los subprocesos salen cuando el índice está al final de la matriz.
Algo como esto:
Creo que esto debería alcanzar el requisito de un subproceso tras otro, pero el orden de los subprocesos no está garantizado. Tengo curiosidad por escuchar otras soluciones también.
fuente
Utilice las API de condición de espera / señal para resolver este problema.
Digamos que el primer hilo elige 1 palabra y mientras tanto, todos los hilos están esperando una señal. El primer hilo imprime la primera palabra y genera la señal al siguiente hilo y luego el segundo hilo imprime la segunda palabra y genera la señal al tercer hilo y así sucesivamente.
fuente
[Los términos utilizados aquí pueden ser específicos para hilos POSIX]
También debería ser posible utilizar un mutex FIFO para resolver este problema.
Dónde utilizar :
Suponga que dos hilos T1 y T2 están intentando ejecutar una sección crítica. Ambos no tienen mucho que hacer fuera de esta sección crítica y mantienen bloqueos por una buena cantidad de tiempo. Entonces, T1 puede bloquear, ejecutar y desbloquear y señalar a T2 para la activación. Pero antes de que T2 pueda despertarse y adquirir el bloqueo, T1 vuelve a adquirir el bloqueo y la ejecución. De esta manera, T2 puede tener que esperar mucho tiempo antes de que realmente se bloquee o no.
Cómo funciona / Cómo implementar:
Tener un mutex para bloquear. Inicialice datos específicos de subproceso (TSD) para cada subproceso en un nodo que contenga ID de subproceso y semáforo. Además, tenga dos variables: propiedad (VERDADERO o FALSO o -1), propietario (identificación del hilo del propietario). Además, mantenga una cola de camareros y un puntero de camarero Último apuntando al último nodo en la cola de camareros.
operación de bloqueo:
Operación de desbloqueo:
fuente
Interesante pregunta. Aquí está mi solución en Java usando SynchronousQueue para crear un canal de encuentro entre hilos:
fuente
Diría que este tipo de preguntas es muy difícil de responder, porque pide la mejor manera de hacer algo completamente estúpido. Mi cerebro simplemente no funciona de esa manera. No puede encontrar soluciones para preguntas estúpidas. Mi cerebro inmediatamente diría que, en estas condiciones, usar múltiples hilos no tiene sentido, así que usaría un solo hilo.
Luego les pediría que hicieran una pregunta del mundo real sobre el enhebrado, o que me dejaran dar un ejemplo del mundo real de algún enhebrado serio.
fuente