I'm not sure exactly how clone() is used when pthread_create() is called. That said, looking at the clone() man page, it looks like there is a flag called CLONE_THREAD which:
  If CLONE_THREAD is set, the child is
  placed in the same thread group as the
  calling process. To make the remainder
  of the discussion of CLONE_THREAD more
  readable, the term "thread" is used to
  refer to the processes within a thread
  group.
  
  Thread groups were a feature added in
  Linux 2.4 to support the POSIX threads
  notion of a set of threads that share
  a single PID. Internally, this shared
  PID is the so-called thread group
  identifier (TGID) for the thread
  group. Since Linux 2.4, calls to
  getpid(2) return the TGID of the
  caller.
It then goes on to talk about a gettid() function for getting the unique ID of an individual thread within a process. Modifying your code:
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <unistd.h>
int errno;
void*
f(void *arg)
{
    printf("%u,%p, %u\n", getpid(), &errno, syscall(SYS_gettid));
    fflush(stdin);
    return NULL;
}
int
main(int argc, char **argv)
{
    pthread_t tid;
    pthread_create(&tid, NULL, f, NULL);
    printf("%u,%p, %u\n", getpid(), &errno, syscall(SYS_gettid));
    fflush(stdin);
    pthread_join(tid, NULL);
    return 0;
}
(make sure to use "-lpthread"!) we can see that the individual thread id is indeed unique, while the pid remains the same.
rascher@coltrane:~$ ./a.out 
4109,0x804a034, 4109
4109,0x804a034, 4110