pthreads, setjmp, longjmp. Как узнать, когда функция закончила работу? - PullRequest
4 голосов
/ 29 октября 2009

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

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

2 голосов
/ 29 октября 2009

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

0 голосов
/ 29 октября 2009

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

...