es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Asignación dinámica de memoria y multiproceso.

Tengo un programa que utiliza algún tipo de árbol, tabla hash y lista, y encuentra similitudes entre dos archivos. Básicamente, es algo así como un índice invertido. El programa funciona bien, pero quiero utilizar la multi-threading para la paralelización.

El problema al que me enfrento es que la parte que quiero paralelizar crea una lista y realiza algunas búsquedas en el árbol que tengo. Esto lleva a resultados incorrectos. Sé que puedo usar mutex y bloquear la parte específica, pero esto no mejora el tiempo en absoluto.

Entonces, mi pregunta es. ¿Puedo asignar memoria para un hilo específico? Y si no puedo, ¿cómo puedo abordar este problema?

A continuación se muestra la parte que quiero paralelizar.

Lista lista;
TablaHash tokenHash;
initializeList(lista);
createHashTable(tokenHash);
char * token = strtok(cur_doc_str, " ");
while(token != NULL) {
    lista = searchTokenAtStructs(token, arbol, hash);
    insertSearchedTokensToHashTable(tokenHash, token);
    token = strtok(NULL, " ");
}

Editar: Soy nuevo en los hilos y me perdí, pero finalmente a través de algunas pruebas de depuración descubrí que el problema es strtok. No es seguro para subprocesos. strtok_r parece hacer el truco.

Gracias a todos por sus respuestas. Me ayudaron a entender mejor los hilos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Dado que el problema está con strtok no siendo seguro para hilos, el primer paso sería cambiar a una versión segura para hilos como strtok_r. Esto debería eliminar cualquier condición de carrera que pueda estar causando los resultados incorrectos.

    En cuanto a la asignación de memoria para hilos, cada hilo tiene su propia pila asignada por el sistema, pero cualquier memoria asignada dinámicamente usando malloc u funciones similares es compartida entre hilos. Sin embargo, puedes usar almacenamiento local al hilo (TLS) para asignar memoria específica para un hilo en particular. Esto se puede lograr utilizando funciones como pthread_key_create y pthread_getspecific.

    Una vez resuelto el problema con strtok, puedes intentar utilizar múltiples hilos para realizar la búsqueda en diferentes partes de los archivos. Cada hilo puede ser asignado a una parte del archivo para trabajar, y los resultados pueden ser fusionados posteriormente. Sin embargo, ten en cuenta que crear demasiados hilos puede conducir a resultados inferiores debido a la sobrecarga involucrada en el cambio de contexto y la sincronización. Puede ser mejor experimentar con diferentes cantidades de hilos y distribución de la carga de trabajo para encontrar la solución óptima para tu caso de uso específico.

Comments are closed.