För att utnyttja flera processorer måste ditt program använda mer än en tråd. En tråd kan bara köras på en processor åt gången, men om du har flera trådar, kan de köra på varsin processor, d v s samtidigt.
Här följer min uppfattning som programmerare om vilken arbetsinsats som krävs för att utnyttja flera processorer. Av beskrivningen nedan bör framgå att ett program inte automatiskt utnyttjar flera processorer, programmeraren måste utföra mer arbete för att detta skall ske.
Vi tänker oss ett hypotetiskt program som har ett grafiskt gränssnitt. I detta gränssnitt finns minst en knapp, som får programmet att utföra något beräkningskrävande arbete.
För det första gäller att det grafiska gränssnittet körs i en egen tråd, GUI-tråden. När du trycker på någon knapp i gränssnittet är det GUI-tråden som blir informerad. Som alla trådar, så kör GUI-tråden bara på en processor i taget.
Därför faller det sig naturligt för den late programmeraren att utföra arbetet i GUI-tråden, på samma ställe i programkoden som han får reda på att knappen blivit nedtryckt.
Medan GUI-tråden jobbar med detta, kan den inte utföra sina vanliga uppgifter, t ex svara på nya "events": inmatningar och musklick. Dessa events läggs i en kö. Om GUI-tråden misslyckas med att processa events under en lång tid, så visas den snurrande badbollen. För att undvika detta, så kan den programmeraren säga att "när GUI-tråden får tid över, skall den utföra en liten del av arbetet, och sen återgå till att hantera events". Men det finns ett bättre sätt...
Den mer ambitiöse programmeraren startar istället en så kallad "worker thread". Denna tråd får inte ändra i gränssnittet, det får bara GUI-tråden göra. Därför måste arbetar-tråden kommunicera med GUI-tråden för att gränssnittet skall kunna ge någon feedback på hur arbetet fortgår.
En programmerare som vill utnyttja flera processorer skapar flera stycken worker threads, minst en per processor, och listar ut ett sätt att dela upp arbetet mellan dessa trådar så att de kan arbeta oberoende av varandra. Om de inte kan det, utan en arbetartråd måste vänta på att en annan ska bli färdig, så har man inget vunnit.
Ett exempel. Photoshop vill applicera ett filter på en bild. Om Adobe's programmerare är lata, så appliceras filtret på hela bilden ifrån gui-tråden. Då svarar inte programmet under tiden, utan visar i bästa fall bara en progressbar.
Om de är lite mer ambitiösa, så startar de en worker thread som gör jobbet, så att man kan göra annat i gränssnittet under tiden, t ex trycka på en "Cancel"-knapp i progress-dialogen.
Om de vill utnyttja flera processorer, t ex 4 stycken, så delar de upp bilden i fyra bitar, och applicerar filtret på varje bit för sig med fyra olika trådar.