2009-10-29 2 views
4

Я пишу библиотеку потоков пользовательского пространства. У меня есть структура, которая управляет каждым потоком. Мои потоки очень просты, они берут функцию ptr и ее аргументы и просто запускают эту функцию один раз.pthreads, setjmp, longjmp. Как вы можете узнать, когда функция завершена?

Каждый поток имеет jmp_buf, и я использую setjmp и longjmp для переключения между потоками. Одна вещь, которую я не могу понять, это то, как сказать, когда эта функция будет закончена.

Для каждого потока я изменяю jmpbuf двумя способами.

  1. Я редактирую ПК и устанавливаю его на указатель функции, поэтому счетчик программ идет туда.
  2. Я также каждый из них имеет свой собственный стек и редактировать SP, так что указывает на тот стек

Таким образом, используя свой контроль нить-структуру можно переключаться между потоками и иметь каждый поддерживать состояние, но не знаю, как чтобы узнать, когда эта функция будет завершена. Когда он закончен, я хочу вызвать специальную функцию exit(), которую я имею.

ответ

2

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

0

Он попытается вернуться туда, где он был вызван изначально - предположительно, ваша функция create_thread.

2

Вместо того, чтобы модифицировать ваш компьютер к пользовательской функции, вы должны фактически вызвать некоторую специальную функцию (назовем ее run_thread()), которая переходит к функции входа этого потока. Когда эта функция ввода вернется (то есть поток вышел), run_thread() должен выполнить любую работу, чтобы указать, что этот поток выполнен (возможно, удалив этот блок управления потоками из списка планирования и добавив его в очистку join() список). Затем он может уступить, и когда родитель звонит join() в свой ID, он будет очищен.