2011-01-31 4 views
17

私はJavaとC#でマルチスレッドプログラミングを経験しており、Linux上でCでそれを行う方法を学び始めています。私はLinux上でプログラミングの意味で "育った"ので、私はそれが高水準でのメモリphilophy、プロセスの処理などであると理解しています。pthreadはどのように動作しますか?

私の質問はスレッドを行う方法ではありません。私はpthreadが実際にどのようにそれをするのか知りたい。それはプロセスをフォークし、何らかの形でプロセス間通信を処理しますか?それともアドレス空間を管理するだけですか?私は素朴な詳細を望んでいます:)グーグルは、「それをどうやって行うのか」という質問だけではなく、「どのように動作するか」を作り出しています。

答えて

9

fork()とptrheadsの両方が、新しいプロセスを作成し、同じシステムコールclone()を、使用しています。それらの違いは、単純にclone()に送るパラメータです。新しいスレッドを作成するときには、両方のプロセスが同じメモリマッピングを使用するだけです。

Linux(およびその他の現代のUnix)では、メモリマッピング、スタック、プロセッサの状態、PIDなどがプロセスの直交する機能であることに注意してください。新しいスタックとプロセス状態(他のすべてを共有する)だけで新しいプロセスを作成し、それをスレッドと呼ぶことができます。

+2

スレッドが共有できないもう1つのことがあります - それは 'TID'値です。 – caf

4

Hereは、pthread.cのソースです。これはあなたの質問に答えるのに役立ちます。

+0

これはLinuxの実装ではなく、pthreadのWindows実装です。 – Victor

12

詳細は、おそらく本当に(glibcのソースコードへのリンクを掲載せず)に入るには余りにも複雑ですが、私はルックアップするためにあなたがより良いものを与えることができます:

  1. のPthreadは、新規作成するsys_clone()を使用していますカーネルは、他のスレッドと多くのデータ構造を共有する新しいタスクと見なします。

  2. 同期を行うために、pthreadはカーネルのfutexesに大きく依存しています。 Linuxの

+0

+1: 'fork()'は同じsyscallを使用しますが、新しいタスクは親との構造が少なくなります。 – Javier

関連する問題