Threads e bifurcação são, na verdade, dois conceitos diferentes, ambos existentes nos sistemas Unix / Linux (e ambos podem ser usados no C / C ++).
A idéia de um fork () é (basicamente) a criação de um processo separado que possui o mesmo código de execução que o processo pai e que inicia a execução na linha de fork. O objetivo do uso de garfos com funções exec é que as funções exec fechem o processo que as chamou quando elas terminam. Portanto, você geralmente bifurca-se, obtendo o PID de cada processo (o filho sempre é 0) e faz com que o pai espere até que o filho termine de executar a função exec.
Os threads são usados para paralelismo (lembre-se de que o pai espera o filho, geralmente, em um programa bifurcado). Um thread, como pthread em C / C ++ (faça uma pesquisa no Google), será executado paralelamente ao processo principal e pode compartilhar variáveis globais e funções globais com o programa original. Como os threads Java se comportam de maneira semelhante, eu imaginaria que eles agem mais como esses threads do que como um processo de bifurcação.
Basicamente, há uma diferença entre bifurcação e rosqueamento. Eles fazem coisas distintamente diferentes (embora pareçam semelhantes). Esses conceitos podem ser difíceis de entender, mas você pode aprendê-los por meio de pesquisas (extensas) se tiver um desejo sincero de entendê-los.
EDIT # 1
Veja estes exemplos de como garfos e threads podem ser chamados e usados. Observe o comportamento das funções exec e seus efeitos no programa principal.
http://www.jdembrun.com:4352/computerScience/forkVSthread.zip