Я не уверен, как именно используется clone () при вызове pthread_create (). Тем не менее, глядя на справочную страницу clone () , кажется, что есть флаг с именем CLONE_THREAD
, который:
Если установлено значение CLONE_THREAD, дочерний элемент
помещены в ту же группу потоков, что и
вызывающий процесс. Сделать остаток
обсуждения CLONE_THREAD подробнее
читаемый, термин «нить» используется для
ссылаются на процессы в потоке
группа.
Группы тем были добавлены в
Linux 2.4 для поддержки потоков POSIX
Понятие набора потоков, которые разделяют
один PID. Внутренне, это поделился
PID - это так называемая группа потоков
идентификатор (TGID) для потока
группа. Начиная с Linux 2.4, звонки в
getpid (2) возвращает TGID
Вызывающий.
Затем мы поговорим о функции gettid () для получения уникального идентификатора отдельного потока в процессе. Изменение вашего кода:
#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;
}
(убедитесь, что вы используете "-lpthread"!), Мы видим, что идентификатор отдельного потока действительно уникален, а pid остается прежним.
rascher@coltrane:~$ ./a.out
4109,0x804a034, 4109
4109,0x804a034, 4110