Grazie mille per la risposta... Parte di ciò che hai detto ne ero già a conoscenza, in particolare di questo...
una nota: se apri il file in condivisione di lettura puoi processare lo stesso file da più thread (ognuno avrà il suo handle ed il suo file pointer).
E' quello che ho fatto, aprendo il file con FILE_SHARE_READ... Probabilmente il mio errore è quello di lavorare con un handle globale. In altre parole, al thread della ricerca non passo come parametro un handle, ma solo la sequenza da ricercare... Per la tua domanda del perchè usassi WaitForMultipleObjects, l'ho fatto per fare in modo che il thread della ricerca, una volta terminate le sequenze da inserire, attendesse l'uscita di tutti i thread prima di mostrare l'output. Copio il codice, abbi pietà ma è ancora in fase embrionale...

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define LENGHT 20

typedef struct {
char* parola;
int occorrenze;} risultato;

risultato array[50];
HANDLE rf;

void cerca (risultato *ris) //Scarica la parola in un buffer
{ //e vede se è una sottostringa di una parola del file
DWORD letti;
int lettiprima=0;
int leggere=LENGHT;
char buffer[LENGHT];

while(ReadFile(rf, buffer, leggere, &letti, NULL))
{
while(leggere>=1){
lettiprima=lettiprima+letti;
leggere=leggere-letti;
ReadFile(rf, &buffer[lettiprima], leggere, &letti, NULL);
}
if(strstr(buffer,ris->parola)!=NULL)
ris->occorrenze=ris->occorrenze+1;
leggere=LENGHT;
letti=0;
lettiprima=0;
}
ExitThread(1);
}

void main ()
{
HANDLE collezione [50];
int i=0, j;
DWORD hid;
char buff[LENGHT];
rf=CreateFile("prova.txt",GENERIC_READ,FILE_SHARE_ READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (rf==INVALID_HANDLE_VALUE)
{printf ("Impossibile aprire il file!");
ExitProcess(1);
}
printf("Inserisci sequenza da ricercare ");
scanf("%s",&buff);
while( strcmp(buff,".")!=0 )
{array[i].parola=strdup(buff);
array[i].occorrenze=0;
collezione[i]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) cerca, &array[i],
NORMAL_PRIORITY_CLASS, &hid);
if (collezione[i]==NULL)
{printf("Creazione thread fallita!");
ExitProcess(1);
}
printf("\nInserisci sequenza da ricercare ");
scanf("%s",&buff);
i=i+1;
}
WaitForMultipleObjects(i-1, collezione, TRUE, INFINITE);
CloseHandle(rf);
for (j=0;j<i;j++)
printf("\nLa sequenza %s occorre in %d parole",array[j].parola, array[j].occorrenze);
}