¿Qué evitar por motivos de rendimiento en código multihilo?

Actualmente estoy revisando / refactorizando una aplicación de multiproceso que se supone que es multihebra para poder usar todos los núcleos disponibles y teóricamente ofrecer un rendimiento mejor / superior (superior es el término comercial para mejor: P)

¿Cuáles son las cosas que debo tener en cuenta al programar aplicaciones de multiproceso?

Me refiero a las cosas que impactarán en gran medida el rendimiento, tal vez incluso hasta el punto en que no gane nada con el subprocesamiento múltiple, sino que pierda mucho por la complejidad del diseño. ¿Cuáles son las grandes banderas rojas para aplicaciones multihilo?

¿Debo comenzar a cuestionar los bloqueos y buscar una estrategia sin bloqueo o hay otros puntos más importantes que deberían encender una luz de advertencia?

Editar: El tipo de respuestas que me gustaría son similares a las respuestas de Janusz, quiero advertencias rojas para buscar en el código, sé que la aplicación no funciona tan bien como debería, necesito saber dónde empezar a buscar, qué Debería preocuparme y dónde debería poner mis esfuerzos. Sé que es una pregunta general, pero no puedo publicar todo el programa y, si pudiera elegir una sección de código, no tendría que preguntar en primer lugar.

Estoy usando Delphi 7, aunque la aplicación se portará / rehace en .NET (c #) para el próximo año, así que prefiero escuchar comentarios que sean aplicables como una práctica general, y si deben ser específicos para cualquiera de los dos. esos idiomas

Respuestas a la pregunta(12)

Su respuesta a la pregunta