Gleichzeitige Programmierung betrifft Operationen, die sich zu überschneiden scheinen, und befasst sich in erster Linie mit der Komplexität, die durch einen nicht-deterministischen Kontrollfluss entsteht. Die mit nebenläufigen Programmen verbundenen quantitativen Kosten sind in der Regel sowohl der Durchsatz als auch die Latenzzeit. Nebenläufige Programme sind oft IO-gebunden, aber nicht immer, z. B. sind nebenläufige Garbage Collectors vollständig auf der CPU. Das pädagogische Beispiel für ein nebenläufiges Programm ist ein Web-Crawler. Dieses Programm startet Anfragen für Webseiten und nimmt die Antworten gleichzeitig an, sobald die Ergebnisse der Downloads verfügbar sind, wobei eine Reihe von Seiten gesammelt wird, die bereits besucht wurden. Der Kontrollfluss ist nicht deterministisch, da die Antworten nicht notwendigerweise bei jeder Ausführung des Programms in derselben Reihenfolge eingehen. Diese Eigenschaft kann das Debuggen von nebenläufigen Programmen sehr schwierig machen. Einige Anwendungen sind von Grund auf nebenläufig, z. B. müssen Webserver Client-Verbindungen gleichzeitig verarbeiten. Erlang , F# asynchrone Arbeitsabläufe und Scalas Akka Bibliothek sind vielleicht die vielversprechendsten Ansätze für hochgradig gleichzeitige Programmierung.
Multicore-Programmierung ist ein Spezialfall der parallelen Programmierung. Bei der parallelen Programmierung geht es um Operationen, die sich überschneiden, um den Durchsatz zu erhöhen. Die Schwierigkeiten der parallelen Programmierung werden umgangen, indem der Kontrollfluss deterministisch gestaltet wird. In der Regel erzeugen Programme Gruppen von untergeordneten Aufgaben, die parallel ausgeführt werden, und die übergeordnete Aufgabe wird erst fortgesetzt, wenn alle Unteraufgaben abgeschlossen sind. Dadurch sind parallele Programme viel einfacher zu debuggen als nebenläufige Programme. Der schwierige Teil der parallelen Programmierung ist die Leistungsoptimierung im Hinblick auf Aspekte wie Granularität und Kommunikation. Letzteres ist im Zusammenhang mit Multicores immer noch ein Problem, da die Übertragung von Daten von einem Cache zum anderen mit erheblichen Kosten verbunden ist. Die dichte Matrix-Matrix-Multiplikation ist ein pädagogisches Beispiel für parallele Programmierung und kann effizient gelöst werden, indem man Straasens Divide-and-Conquer-Algorithmus verwendet und die Teilprobleme parallel anpackt. Cilk ist vielleicht der vielversprechendste Ansatz für die parallele Hochleistungsprogrammierung auf Multicores und wurde sowohl in Intels Bauklötze mit Gewinde und Microsofts Aufgabe Parallele Bibliothek (in .NET 4).