LINUX.ORG.RU

Linux threads ведут себя о разному


0

0

Есть простенькая программа (пример взят из Advanced Linux Programming):
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* thread_function (void* unused)
{
fprintf(stderr, "Child thread PID = %d\n", (int) getpid());
while(1);
return NULL;
}

int main ()
{
pthread_t thread;
fprintf(stderr, "Main thread PID = %d\n", (int) getpid());
pthread_create (&thread, NULL, &thread_function, NULL);
while(1);
return 0;
}

и есть 4 Linux-системы (в скобках версия ядра) - Slackware 10.2 (2.6.12.5), Slamd64 10.1 (2.6.11.10), RedHat 9.0 (2.4.20-8) и RedHat 7.0 (не знаю)

Компилируем программу: gcc prog.c -o prog -lpthread

Запускаем эту программу на Slamd64 и RedHat7.0 и смотрим ps ax -L:
27530 27530 pts/2 R+ 0:04 ./prog
27531 27531 pts/2 S+ 0:00 ./prog
27532 27532 pts/2 R+ 0:02 ./prog
Все как должно быть (и как написано в книге) - основной поток, один дочерний thread и один управляющий thread, pid и LWP у всех разный

Запускаем эту программу на Slackware и RedHat9.0 и смотрим ps ax -L:
18544 18544 pts/5 Rl+ 0:00 ./prog
18544 18545 pts/5 Rl+ 0:00 ./prog
Управляющего потока нет, pid одинаковый

strace ./prog на Slamd64:
--cut--
clone(child_stack=0x503070, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND) = 27543
--cut--

strace ./prog на Slackware:
--cut--
clone(child_stack=0xb7e44504, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLO NE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb7e44bf8, {entry_number:6, base_addr:0xb7e44bb0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb7e44bf8) = 18538
--cut--

Очевидно, что разница во флагах вызова clone. Но блин, почему? Откуда эта разница берется и как ее исправить?

а что не так устраивает?
в 2.6 наверное работает Native POSIX Threads Library,
а в 2.4 нет.

fghj ★★★★★
()
Ответ на: комментарий от fghj

Да все устраивает, но я хочу понять принципы работы потоков, а они на разных системах по разному работают.

ещё раз: Slackware 10.2 (2.6) и RedHat9.0 (2.4) - работает не так, как должно
Slamd64 10.1 (2.6) и RedHat 7.0 (2.4) - работают, как написано в книжке
так что NPTL тут видимо не виноват

может просто позапускаете этот пример на своих системах, покажете результаты?

Negative
() автор топика
Ответ на: комментарий от Negative

Может, твоя книжка немного устарела?

mr ★★
()
Ответ на: комментарий от Negative

> ещё раз: Slackware 10.2 (2.6) и RedHat9.0 (2.4) - работает не так,
> как должно Slamd64 10.1 (2.6) и RedHat 7.0 (2.4) - работают, как
> написано в книжке так что NPTL тут видимо не виноват

Если у тредов одного процесса разные PID то это LinuxThreads,
которые obsoleted и которым (не побоюсь возможного флейма) самое
место на свалке. Если у тредов одного процесса один и тот же PID,
то это наверное белые и пушистые NPTL.
Похоже книжка у тебя старая и то как "там написано" это совсем не
так, как "должно быть" в более-менее современной системе.

Про LinuxThreads: http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html
BTW, что тебя удержало от самостоятельного поиска в Google на
тему "LinuxThreads NPTL difference"?

Onanim
()
Ответ на: комментарий от Negative

>RedHat9.0 (2.4)

дело в том что NPTL написали как раз RH
и соотвественно, NPTL начиная,
с по-моему RH 8.0 в их 2.4 ядре обитало.
А в 2.6 NPTL уже вошло в vanilla.

fghj ★★★★★
()
Ответ на: комментарий от fghj

> дело в том что NPTL написали как раз RH
> и соотвественно, NPTL начиная,
> с по-моему RH 8.0 в их 2.4 ядре обитало.
> А в 2.6 NPTL уже вошло в vanilla.
>

Независимо от дистрибутива, если у тредов разные PID - это не NPTL.
Что касается RH, то посмотрев на http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/release-notes/x86/
видим, что оно умеет и NPTL и LinuxThreads.
Так что ничего удивительного в LinuxThreads на RH 9 нет.

Onanim
()
Ответ на: комментарий от Onanim

Большое спасибо Onanim и fghj.

Не смотрел в гугле, потому что просто не знал в какую сторону смотреть. Будем читать.

Negative
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.