2012-03-25 9 views
3

は、自分のスレッディングライブラリを実装する方法を知りたかったのです。
私はCPU(PowerPCアーキテクチャ)とC標準ライブラリを持っています。スレッディング実装

私が見ることができるオープンソースの軽量実装ですか?

+0

プラットフォーム/ OSはどれですか? –

+2

ハードウェア割り込みなどとやりとりする必要があるため、C標準ライブラリ以上のものが必要です。 –

+0

ザイリンクスPowerPC 440 APIを使用してこの能力を得ました – socksocket

答えて

2

その非常に簡単に言うスレッドが必要になります。

  1. をいくつかのメモリスタック空間のため
  2. どこかにそのコンテキストを格納する(すなわち、内容を登録し、プログラムカウンタ、スタックポインタ、など。)

さらに、スレッドの切り替えを担当する簡単な「カーネル」を実装する必要があります。プリエンプティブスレッドを実装しようとしている場合は、定期的な割り込み源も必要になります。例えば。タイマー。この場合、タイマ割り込みでスレッド切り替えコードを実行することができます。

setjmp()/ longjmp()ルーチンと対応するjmp_buf構造体を見てください。これにより、スタック・ポインタに簡単にアクセスできるようになり、独自のスタック・スペースを割り当てることができ、スレッドのコンテキストを提供するためにすべてのレジスタ内容を簡単に取り込むことができます。

通常、longjmp()関数は、割り込みからの復帰命令のラッパーです。これは、タイマ割り込みでスレッドのスケジューリング機能を持つことに非常に適しています。あなたのプラットフォーム用のlongjmp()とjmp_bufの実装をチェックする必要があります。

通常、OSを搭載していない小型のマイクロプロセッサでスレッドの実装を探してみてください。例えば。 Atmel AVR、またはMicrochip PICが含まれます。 例:discussion on AVRFreaks

0

多分あなたはスレッドのサポートを持っているC++を見ることができます。私は、最も有用なプリミティブ(例えば先物)をいくつか選んで、それらがどのように動作するかを見て、簡単な実装を行うことから始めます。

+2

C++にはC++ 11のネイティブスレッドのみがあります。また、ベアメタル環境用(つまりOSなし)のコンパイラではサポートされない可能性があります。 –

+0

私は彼がそれを使うべきではないと勧めます。彼は何をすべきかを学んでいる。 – usr

+0

ああ、そうだ。基本的な実装がOSのスレッドAPIに依存していると思います。 –

1

必要なまともなスレッドライブラリの場合:(たとえば、ミューテックスを実装するために)レースを回避するために

  • アトミック操作
  • スケジューリングを行うにして
  • いくつかのOSを待って忙しい避けるために、いくつかのOSをサポートコンテキスト切り替えを実装するためのサポート

すべての3つは、C99が提供するものの範囲を超えます。原子操作はC11で導入されていますが、今のところC11実装は準備ができていないようです。したがって、これらは通常アセンブラで実装されます。後の2つはOSに依存する必要があります。