O que evitar por motivos de desempenho no código multithread?

No momento, estou revisando / refatorando um aplicativo multithreaded que deve ser multithreaded para poder usar todos os núcleos disponíveis e, teoricamente, fornecer um desempenho melhor / superior (superior é o termo comercial para melhor: P)

Quais são as coisas que eu deveria estar ciente ao programar aplicativos multithread?

Quero dizer coisas que irão impactar muito o desempenho, talvez até ao ponto em que você não ganha nada com multithreading, mas perde muito pela complexidade do design. Quais são as grandes bandeiras vermelhas para aplicativos multithreading?

Devo começar a questionar as fechaduras e olhar para uma estratégia de bloqueio ou há outros pontos mais importantes que devem acender uma luz de advertência?

Editar: O tipo de resposta que eu gostaria é semelhante à resposta de Janusz, eu quero avisos vermelhos para procurar em código, eu sei que o aplicativo não funciona tão bem como deveria, eu preciso saber onde começar a procurar, o que deve me preocupar e onde devo colocar meus esforços. Eu sei que é uma questão geral, mas não posso postar todo o programa e se eu pudesse escolher uma seção de código, então eu não precisaria perguntar em primeiro lugar.

Estou usando o Delphi 7, embora o aplicativo seja portado / refazido no .NET (c #) para o próximo ano, então prefiro ouvir comentários que sejam aplicáveis ​​como prática geral, e se eles devem ser específicos para qualquer um dos dois. essas linguas

questionAnswers(12)

yourAnswerToTheQuestion