Создание библиотеки потоков в пространстве пользователя с помощью pthread. Как правильно создать первый поток? (ну первые 2 темы) - PullRequest
0 голосов
/ 28 октября 2009

Итак, я создаю библиотеку потоков в пространстве пользователя. скажем, есть какая-то программа, которая его использует.

в этой программе он начинается с основного метода. перед любыми вызовами create_thread нет активных потоков.

тогда при создании первого потока библиотека создает 2 потока. Один для «основного» и один для реальной новой роли, которую вы делаете. Это ключевой шаг для параллельной работы.

Единственное, что мне нужно для этой работы - назначить указатель в каждом объекте потока, который я создаю, на следующую строку кода, которая должна быть запущена при запуске потока. Для потока, который я создаю, это просто, это указатель на функцию.

Для потока 'main' это должно указывать на следующую строку кода в main после создания.

Как мне получить этот адрес?

1 Ответ

1 голос
/ 28 октября 2009

Это зависит от платформы, обычно основано на некотором регистре процессора. Если память обслуживает меня правильно, обычно на x86 с нормальным соглашением о вызовах, это что-то вроде [ebp + 4]. Но, как вы могли бы сказать, это сильно зависит от процессора и соглашения о вызовах. Например, в PowerPC он хранится в чем-то, называемом «регистром ссылок» ... Подобные вещи можно получить с помощью встроенного asm.

Имейте в виду, что вам придется восстанавливать стек там, где он был также ... Реализация потоков в пространстве пользователя (или ядра в этом отношении) обычно будет хранить указатель стека для каждого контекста, и когда придет время для переключения контекста вы можете сделать что-то вроде инструкции x86 pushad (сохранить все регистры в стеке), поменять местами указатели стека и восстановить любое другое нужное вам состояние. Затем вы делаете что-то вроде popad и возвращаетесь туда, где вы были раньше. (возможно с инструкцией ret; в подпрограмме прерывания это будет iretd)

Но обратите внимание, что в интерфейсе, подобном pthread_create(), то, что вы называете "главным потоком", довольно неявно ... Эта подпрограмма создает новый поток и говорит ему начать с какой-то конкретной подпрограммы, а парень возвращается из этого это "основная тема" в вашем случае. Вы можете обнаружить, что эта модель немного меньше головной боли, чем подпрограмма создания потока, явно вставляющая что-то с <eip, esp> (инструкция возврата ptr, стек ptr) в некоторый список потоков ...

...