En windows mejor usa _beginthreadex o la funcion de la api CreateThread:
Código C:
Ver originalHANDLE ht;
unsigned long tid;
if(!(ht = (HANDLE)_beginthreadex(0, 0, &mi_thread, 0, 0, &tid))) {
//error
}
else {
//si necesitas recuperar datos del proceso tienes que esperar a que termine
WaitForSingleObject(ht, INFINITE);
//finalmente liberas el puntero
CloseHandle(ht);
}
Busca mas información sobre esta funcion para ver los argumentos y los valores de retorno.
"...se nesesita ser muy cuidado al programarlos y que se nesesita de un semaforo..."
Se necesita un semaforo cuando trabajas con variables globales, de lo contrario no lo necesitas. La api de windows lleva implementadas las funciones de seccion critica que seria un semaforo. La finalidad del semaforo es impedir que dos o mas procesos intenten trabajar sobre una misma seccion de memoria.
"...cuando seria comveniente usar los threads..."
Se usan cuando no quieres bloquear el proceso padre, un ejemplo muy comun es en aplicaciones de red. Cualquier situacion donde una funcion bloqueante no es indispensable para el funcionamiento de la aplicacion se suele apartar en un proceso, una vez finalizado se notifica (al proceso padre, o donde sea) y se recuperan los datos con los que trabajaba el thread.
Saludos
vosk