Citar
int *P(int threadid)
{
cout<<"Intento "<< threadid <<"Entrando a Seccion Critica\n";
pthread_exit(NULL);
}
De partida esto esta malo, le pides que te devuelva un puntero a int, pero no le estas retornando nada.
Citar
cout<<"Entrando a Seccion Critica, Contador:" counter<<endl;
Malo
cout<<"Entrando a Seccion Critica, Contador:" << counter<<endl;
Errores que pille a la rapida, no obstante hay problemas de lógica como explico Sami.
Btw, te complicaste solo, C++ es bastante mas dificil que Java xD



.

!.