Поймать возврат основной функции, прежде чем она освободит ресурсы - PullRequest
0 голосов
/ 19 мая 2010

Я пытаюсь реализовать пользовательские потоки в ядре Linux 2.4, и я столкнулся с чем-то проблематичным и неожиданным.

Справочная информация: поток в основном выполняет одну функцию и умирает, за исключением того, что когда я вызываю thread_create в первый раз, он также должен превратить main () в поток (по умолчанию это не поток до первого вызова, что также, когда все связанные структуры данных выделены).

Поскольку поток выполняет функцию и умирает, нам не нужно никуда "возвращаться" вместе с ней, но нам нужно сохранить возвращаемое значение, которое позже будет возвращено с помощью thread_join, поэтому взлом, который я придумал, был: когда я выделяю стек потоков, я помещаю адрес возврата, который указывает на функцию thread_return_handler, которая освобождает поток, делает его зомби и сохраняет его возвращаемое значение для дальнейшего использования. Это работает для потоков "просто запусти функцию и умри", но очень проблематично с основным потоком. Так как это на самом деле основная функция, если она возвращается до того, как другие потоки завершают работу, запускается нормальный механизм возврата и освобождает все общие ресурсы, тем самым облажая все работающие потоки.

Мне нужно помешать этому. Любые идеи о том, как это можно сделать?

1 Ответ

1 голос
/ 19 мая 2010

Вы можете зарегистрировать функцию с atexit(), которая вызывается при завершении программы. Обратите внимание, что вы не можете определить разницу между вызовом exit() и возвратом из main().

... и это касается сути вопроса. Традиционно возврат из main() аналогичен вызову exit(), что означает, что весь процесс должен быть завершен, включая все еще работающие потоки. Другими словами, «основной поток» является особенным. Вы уверены, что не можете просто задокументировать это как ожидаемое поведение? В конце концов, именно так работают другие модели потоков UNIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...