Реализация потоков - PullRequest
       13

Реализация потоков

3 голосов
/ 26 марта 2012

Я хотел знать, как реализовать мою собственную библиотеку потоков.
У меня есть процессор (архитектура PowerPC) и стандартная библиотека Си.

Есть ли легковесная реализация с открытым исходным кодом, на которую я могу посмотреть?

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

В самом простом потоке потребуется:

  1. Некоторая память для стекового пространства
  2. Где хранить свой контекст (т. Е. Содержимое регистра, счетчик программы, указатель стека и т. Д.)

Кроме того, вам нужно реализовать простое «ядро», которое будет отвечать за переключение потоков. И если вы пытаетесь реализовать упреждающий поток, то вам также понадобится периодический источник прерываний. например. таймер В этом случае вы можете выполнить код переключения потоков в прерывании таймера.

Взгляните на процедуры setjmp () / longjmp () и соответствующую структуру jmp_buf. Это даст вам легкий доступ к указателю стека, чтобы вы могли назначить свое собственное пространство стека, и даст вам простой способ захвата всего содержимого регистра, чтобы обеспечить контекст вашего потока.

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

Попробуйте поискать реализации потоков на более мелких микропроцессорах, которые обычно не имеют ОС. например. Atmel AVR, или Микрочип ПИК. Например: обсуждение AVRFreaks

1 голос
/ 26 марта 2012

Для приличной библиотеки потоков вам нужно:

  • атомарные операции, чтобы избежать гонок (например, для реализации мьютекса)
  • поддержка некоторых ОС для планирования и предотвращения ожидания ожидания
  • поддержка некоторых ОС для переключения контекста

Все три выходят за рамки того, что предлагает вам C99. Атомарные операции введены в C11, до сих пор реализации C11, кажется, не готовы, поэтому они обычно реализуются в ассемблере. Для последних двух вам придется полагаться на вашу ОС.

0 голосов
/ 26 марта 2012

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

...