スタックを除いて、スレッドがプロセスのすべてのセグメントを共有しているとは思えません。したがって、スレッド間で通信するには、あるスレッドから別のスレッドに「Hello」という単語を渡したいとします。IPC メカニズム (メッセージ キューなど) の必要性は何ですか。
2 に答える
優れたPthreads チュートリアルを読んで、さらに学ぶには数時間かかるはずです。Advanced Linux Programmingなどを読んで、基本的な IPC (プロセス間通信) 機構をより理解する必要があります。
最新のC++11標準をサポートする C++ コンパイラを使用すると、そのC++ スレッドライブラリを使用できます (多くの場合、pthreads の上に構築されます)。これにはGCC 4.8以上またはClang 3.3以上が必要です(flag toまたはcompilerを使用し-std=c++11
てg++
くださいclang++
)。
特定のプロセスのすべてのスレッドは、特定のメモリ モデルを通じて同じアドレス空間を共有しています(多くの場合、ハードウェア アシストキャッシュ コヒーレンスを使用します) 。
proc(5)についてもっと学ぶことをお勧めします。このコマンドcat /proc/1234/maps
は、pid 1234 のプロセスのアドレス空間を表示します。
特に、スタックは実際には各スレッドの分離されたセグメントではありません。つまり、スレッドは他のスレッドのスタック上のデータにアクセスできます。たとえば、スタック上のローカル 変数を持つスレッドがどこかにアドレスを書き込み (たとえば、 C ステートメントを含むグローバル変数)、別のスレッドがそのポインターを逆参照することができます(ただし、これはプログラミング スタイルが貧弱です)。特定のプロセスのスレッドのすべてのスタックは、依然として同じアドレス空間にあります。int x;
&x;
g
g = &x;
*g
ただし、本当に必要なのは、スレッドを同期することです。pthreadの主な目的は、同期のためのいくつかの手段 ( mutexと条件変数、バリア、セマフォなど) を提供することです。最近の言語標準には、C++11 のstd::atomicや C11 のstdatomic.hのような原子性構造もあります。競合状態とデッドロックに注意してください! ハイゼンバグの可能性があるため、マルチスレッド (またはその他の並列) プログラムのデバッグは苦痛です。おそらく、関数型プログラミングスタイルを優先する必要があります。
並列プログラミングが難しいため、マルチスレッド プログラミングは困難です。
スレッド間で IPC メカニズムを使用できます。たとえば、pipe(2)を使用して、1 つのスレッドで書き込み、別のスレッドで読み取ることができます (おそらくpoll(2)との多重化...)。しかし、スレッドをコーディングするときは、多くの場合、pthread メカニズムを使用することを好みます (たとえば、リンクされたリストにグローバル データ リンクを設定し、mutexをロックすることによってシリアルにアクセスします)。次に、条件変数を使用して空から非空への遷移を通知し、(空の) リンク リストから要素を取得するときにその条件を待機する必要があります。これは生産者と消費者の関係です。あなたのような文字列のために共有キューやリストなどを持つことができます"Hello World"
が、それでもスレッドを同期する必要があります。