LINUX.ORG.RU

Как можно подождать собственный поток? (clone()+waitpid(), без pthread)

 , , ,


0

2

Приветствую.

Собственно, мне нужно заиметь вспомогательный поток, при этом не пользуясь pthread.

Заиметь-то я его заимел с помощью clone() (без CLONE_PARENT), поток завершается с помощью syscall(__NR_exit, 0) — а как теперь его подождать в основном потоке? waitpid(tid, NULL, __WALL) говорит -ECHILD.

UPD: окей, ман говорит, что так делать нельзя:

              A new thread created with CLONE_THREAD has the same parent
              process as the caller of clone() (i.e., like CLONE_PARENT), so
              that calls to getppid(2) return the same value for all of the
              threads in a thread group.  When a CLONE_THREAD thread
              terminates, the thread that created it using clone() is not
              sent a SIGCHLD (or other termination) signal; nor can the
              status of such a thread be obtained using wait(2).  (The
              thread is said to be detached.)

А как тогда?

★★★★★

Последнее исправление: intelfx (всего исправлений: 5)

Реализовать ожидание самому, аналогично реализации в pthreads. Т.е. взять futex и ожидать изменение переменной в основном потоке, а в вспомогательном сделать на ней WAKE. Примерно так.

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

А, так вот для чего у clone() есть CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID!

Окей, исходный вопрос снимается, но... а как это решалось до Linux 2.5.49, в котором появились вышеуказанные флаги? Вдруг поток забудет пнуть фьютекс и просто сделает exit()?

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

Эти флаги добавили для NPTL реализации pthreads, чтобы она всегда работала. Другие реализации ведь были неполноценными (или требовали подобных изменений в ядре), так что с ними join мог и не отрабатывать во всех случаях.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek

А, так вот почему мы все очень сильно любим nptl. Спасибо.

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