12

POSIXライブラリを使用せずにCでマルチスレッドを実装したいと思います。どんな助けでもいただければ幸いです。

しない:fork()またはvfork()を使用しないでください。

4

4 に答える 4

15

Linuxのスレッドは、基本的に、メモリとリソースをその親と共有するプロセスです。Linuxカーネルは、プロセスとスレッドを区別しませ。つまり、他のオペレーティングシステムのように、Linuxには軽量プロセスの概念がありません。Linuxのスレッドは標準clone()プロセスとして実装されているため、通常fork()は次の方法で呼び出されるスレッドを使用してスレッドを作成できます。

clone(SIGCHLD, 0);

これにより、シグナルハンドラーのみが複製されますが、適切なフラグを使用してスレッドを作成できます。

clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);

これは、アドレススペース、ファイルシステムリソース、ファイル記述子、および信号ハンドラーが2つのプロセスによって共有されることを除いて、前の呼び出しと同じです。

別のアプローチは、ユーザーレベルで実装された実行スレッドであるユーザーレベルのスレッド(ファイバーとも呼ばれる)を使用することです。つまり、OSはこれらのスレッドを認識せず、スケジューリングまたはコンテキストの切り替えをユーザーで行う必要があります。レベル。ほとんどのユーザーレベルのスケジューラーは協調スケジューラーとして実装されますが、単純なラウンドロビンスケジューリングを使用してプリエンプティブスケジューラーを実装することもでき ます。

詳細については、clone(2)のマニュアルページを確認してください。詳細が必要な場合は、Linuxカーネル開発第3版をお勧めします。RobertLove(著者とは一切関係ありません)の内部リンクを参照してください。オンライン。ユーザーレベルのスレッドに関しては、私が書いたlibutaskと呼ばれる最小限のパッケージがあり、協調スケジューラとプリエンプティブスケジューラの両方を実装しています。必要に応じて、ソースコードを確認できます。

注1:UNIXについては触れていませんが、私が知る限り、これはLinux固有の実装です。

注2:クローンを使用して独自のスレッドを作成することは実際の解決策ではありません。対処しなければならない可能性のあるいくつかの問題についてのコメントを読んでください。これは、pthreadを使用せずにスレッドを作成できるかどうかという質問に対する答えにすぎません。この場合は答えはイエスです。

于 2012-11-08T05:55:22.723 に答える
7

見る:

UNIXライクなシステムの場合。

以下も参照してください。

BSDおよび最新のUNIX用。

このページでは、これらのプリミティブなどを使用したベアボーン実装の多くの例を示します。

アトミック命令を使用して、ロックプリミティブ(ミューテックス、セマフォ)を実装できます。

また、いくつかのヒントを得るために、ユーザーランドスレッドライブラリの実際の実装を確認することをお勧めします。Linuxの実装のリストを提供するこのページを参照してください。

最後に、コルーチンとおそらくトランポリンに関する情報を取得することをお勧めしますが、後者はそれほど密接に関連していません。

于 2012-11-08T09:47:36.043 に答える
4

<threads.h>C標準ライブラリから新しいヘッダーをチェックアウトすることもできます。(C11)

必要なint thrd_create(thrd_t *thr, thrd_start_t func, void *arg);ものだけでなく、ミューテックス関数と条件変数もあります。

于 2012-11-08T06:33:32.980 に答える
2

ほとんどすべてのオペレーティングシステムの上にプレーンなcを備えた少なくとも協調的なマイクロカーネルを作成できることは間違いありません。基本的には、スタックフレームのクローンを作成するだけで済みます(それに応じていくつかのポインターを調整します。特に、関数から他のスレッドへのリターンアドレスを現在のリターンアドレスに調整します)。また、スタックをヒープとバックに「コンテキストスイッチ」するなど、いくつかのユーティリティ機能があります。

コールバックによるタイマー割り込みが許可されている場合は、プリエンプティブマイクロカーネルを実行できます。

少なくともドブス博士とIOCCCは、これらの方針に沿った選択肢を提示しています。

于 2012-11-08T06:07:29.360 に答える