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 における擬似クラスの一般的な使用法の詳細な説明

推薦する

Vue3.0 における Ref と Reactive の違いの詳細な分析

目次参照と反応参照反応的RefとReactiveの違いshallowRef と shallowRea...

JavaScript における型の必須および暗黙的な変換の詳細な説明

目次1. 暗黙的な変換二重等号での変換ブール型変換「+」と「-」 2. 強制型変換' ...

CSS の優先順位に関する詳細な紹介

CSS の優先順位について話す前に、CSS とは何か、CSS が何に使用されるのかを理解する必要があ...

セマンティックタグを使用して、IE6、7、8と互換性のあるHTMLを記述します。

HTML5 では、ヘッダー、フッター、ナビゲーションなどのセマンティック タグが追加されているため...

XHTML ブロックレベルタグの概要

* 住所 - 住所* blockquote - ブロック引用* center - 中央揃えブロック*...

MySQLとElasticsearch間のデータ非対称性問題の解決策

MySQLとElasticsearch間のデータ非対称性問題の解決策jdbc-input-plugi...

Mac VMware Fusion CentOS7 静的 IP 構成チュートリアル図

目次CentOS7をインストールする静的IPの設定viを使用してファイルを編集するCentOS7をイ...

Vueはダイアログのカプセル化を実装します

目次Vue2 ライティングVue3プラグインのバージョンの記述Vue3 動的コンポーネントの記述書き...

JavaScript配列をツリー構造に変換する方法

1. 需要バックエンドは、フロントエンドがツリー構造(重複データなし)に変換するためのデータを提供し...

CentOSにPHP+Apache+MySQLのサーバー環境をインストールして構築する

Yum (フルネームは Yellow dog Updater, Modified) は、Fedora...

HTML テーブルタグチュートリアル (44): テーブルヘッダータグ

<br />ソース コード内で表の構造を明確に区別するために、HTML 言語では、表のヘ...

MySQLのファジークエリのような遅い速度を解決する方法

質問: インデックスは作成されているのに、Like ファジー クエリがまだ遅いのはなぜですか?インデ...

React、Angular、Vueの3つの主要なフロントエンド技術の詳細説明

目次1. 反応する基本的な使い方注目すべき機能クラスコンポーネント仮想DOMライフサイクルメソッドJ...

Vue+Websocketはチャット機能を実装するだけです

この記事では、チャット機能を簡単に実装するためのVue+Websocketの具体的なコードを参考まで...