На рисунке 11.2 APUE 2, есть код для записи демо использование резьб API, как показано ниже:Является ли APUE неправильным описанием потоков linux?
#include <pthread.h>
#include <stdio.h>
pthread_t ntid;
void printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n", s,
(unsigned int)pid, (unsigned int)tid, (unsigned int)(tid));
}
void *thr_fn(void *arg)
{
printids("new thread: ");
return (void*)0;
}
int main(void)
{
int err;
err = pthread_create(&ntid, NULL, thr_fn, NULL);
if (err != 0)
return -1;
printids("main thread: ");
sleep(1);
return 0;
}
и книга говорит выход, как это,
$./a.out
new thread: pid 6628 ...
main thread: pid 6626 ...
Pid отличается! Это связано с тем, что «Linux использует clone() для реализации потоков, так же как fork(), поэтому система рассматривает потоки как отдельные процессы, которые совместно используют ресурсы».
Но когда я проверил, я обнаружил, что результат отличается от результата APUE, который
$ ./a.out
main thread: pid 13301 tid 3078153920 (0xb778e6c0)
new thread: pid 13301 tid 3078151024 (0xb778db70)
Идентификатор это то же самое! так APUE устарел? Но linux действительно использует клон для реализации потоков, а в ядре linux они рассматриваются как разные процессы. Почему идентификатор процесса одинаковый?