Linux でのマルチスレッドにおけるフォークの紹介

Linux でのマルチスレッドにおけるフォークの紹介

質問:

プログラムにメイン スレッドが 1 つしかなく、 fork が呼び出された場合、 fork によって作成された子プロセスにもスレッドが 1 つしか存在しないことに注意してください。

マルチスレッド プログラムに fork を組み込むとどうなるでしょうか?

試してみましょう:

ケース(1)子スレッドを作成する前にフォークする

コード:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* pthread_fun(void* 引数)
{
	printf("fun = %d\n", getpid());
	pthread_exit(NULL);
}
int メイン()
{
	フォーク();

	pthread_t ID;
	pthread_create(&id, NULL, pthread_fun, NULL);
	
	printf("main_pid = %d\n", getpid());
	pthread_join(id, NULL);

	0を返します。
}

結果: フォークされた子プロセスも独自の子スレッドを作成します (兩個進程:四個線程)

ここに画像の説明を挿入

ケース(2)子スレッドを作成した後にフォークする

コード:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* pthread_fun(void* 引数)
{
	printf("fun = %d\n", getpid());
	pthread_exit(NULL);
}
int メイン()
{

	pthread_t ID;
	pthread_create(&id, NULL, pthread_fun, NULL);
	フォーク();
	
	printf("main_pid = %d\n", getpid());
	pthread_join(id, NULL);
	0を返します。
}

結果: 子スレッドを作成した後、子プロセスが作成されます。このとき、フォークした子プロセスはフォーク後のコードのみを実行します (兩個進程:三個線程)

ここに画像の説明を挿入

ケース(3)子スレッドの分岐

コード:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void* pthread_fun(void* 引数)
{
	フォーク();
	printf("fun = %d\n", getpid());
	pthread_exit(NULL);
}
int メイン()
{

	pthread_t ID;
	pthread_create(&id, NULL, pthread_fun, NULL);
	
	printf("main_pid = %d\n", getpid());
	pthread_join(id, NULL);

	0を返します。
}

結果:

ここに画像の説明を挿入

結論は:

どのスレッドがフォークされるかによって、フォーク後に作成された子プロセスはこのスレッドをメインスレッドとして使用し、このスレッドの後のコードを実行します。

Linux のマルチスレッドにおけるフォークに関するこの記事はこれで終わりです。Linux のマルチスレッド フォークに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Pythonのガベージコレクションの仕組みの詳しい説明
  • Python言語開発ガベージコレクションメカニズム原理チュートリアル
  • Python ガベージコレクション機構の原理分析
  • Python のガベージコレクションはどのように実装されていますか?
  • Linux マルチスレッドにおけるフォークとミューテックス ロック プロセスの例
  • Python ガベージコレクションと Linux フォーク

<<:  インライン要素とブロック要素とは何ですか?

>>:  CSS3 における擬似クラスの一般的な使用法の詳細な説明

推薦する

Vueで背景色と透明度を設定する方法

背景色と透明度の設定上記のように、最初の画像の場合は、灰色の背景と左上隅に白い「カバー」という文字を...

Bootstrap 3.0 学習ノートのボタンとドロップダウン メニュー

前回の記事はBootstrap CSS部分の簡単なレビューであり、多くの詳細が見落とされていました。...

モバイル端末の適応により、px は自動的に rem に変換されます。

まずpostcss-pxtoremをインストールします: npm install postcss-p...

フォーム内の無効なフォームフィールドの値を送信する方法 サンプルコード

フォーム内のフォーム フィールドが無効に設定されている場合、フォーム フィールドの値は送信されません...

CSSはカラフルでスマートな影の効果を実現します

背景前景要素から特定の色を継承する影の効果を作成する方法を知りたいと思ったことはありませんか?方法に...

ホワイトボードを踏まないようにするゲームを実装するための HTML+CSS+JS

目次背景1. 思考分析2. ページ構成2.1 HTML レイヤー2.2 CSS レイヤー2.3 JS...

Windows 10 で Hyper-V サービスをシャットダウンするいくつかの方法

VMware Workstation を使用して Windows 10 で仮想マシンを開くと、VMw...

Reactにおけるコンポーネント通信の詳細な説明

目次親コンポーネントは子コンポーネントと通信します子コンポーネントは親コンポーネントと通信しますコン...

MySQL は information_schema オブジェクトの付与をバイパスし、ERROR 1044 (4200) エラーを報告します

この質問は、MySQL の権限に関する WeChat グループのネットユーザー間の議論です。次のよう...

ウェブサイトはグレー表示されています。画像を含む互換コードはすべてのブラウザをサポートしています

通常、国喪の日、大地震の日、清明節には、ウェブサイト全体を灰色にして、故人への哀悼の意を表します。そ...

jQueryはショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのjQueryの具体的なコードを参考までに共有...

Linux における「!」の知られざる使用法のまとめ

序文実際、Linux では、控えめな「!」が驚くほど多くの用途で使用されています。この記事では、「!...

HTML+CSSを使用してマウスの動きを追跡する

ユーザーがプライバシーを意識するようになり、オンライン トラッキングに対する予防策を強化するにつれて...

vue_drf は SMS 認証コードを実装します

目次1. 需要1. 需要2. SDKパラメータ設定1. ディレクトリ構造3. コードの実装1. バッ...

Linux dirnameコマンドの具体的な使い方

01. コマンドの概要dirname - ファイル名からディレクトリ以外のサフィックスを削除しますd...