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

推薦する

MySQL で GTID モードをオンラインで有効または無効にする

目次基本的な概要GTIDをオンラインで有効にする1. GTID検証ENFORCE_GTID_CONS...

Mysql テーブルで利用可能な最小 ID 値を照会する方法

今日、研究室のプロジェクトを見ていたとき、私にとって「難しい」問題に遭遇しました。実は、それは私があ...

Vueのキャッシュ方法の例の詳細な説明

最近、「フロントエンドキャッシュ」という新しい要件が作成されました要件背景: フォームへの高頻度の繰...

LinuxでMySQLのリモートアクセス権を有効にし、ファイアウォールでポート3306を開きます。

mysqlのリモートアクセス権を有効にするデフォルトでは、MySQL ユーザーにはリモート アクセ...

Vue3 の動的コンポーネントはどのように機能しますか?

目次1. コンポーネントの登録1.1 グローバル登録1.2 グローバルコンポーネントの登録プロセス1...

ウェブページの読み込み速度を上げる6つのヒント

第二に、キーワードのランキングは、Webページの表示速度にも関係しています(参照:キーワードランキン...

Dockerはコンテナにポートを動的に公開します

コンテナのIPアドレスを表示するdocker examine <コンテナ名またはID> ...

JavaScript は大容量ファイルのアップロード処理を実装します

数十 MB 程度の小さいものから 1G 以上の大きいものまで、ビデオ ファイルなどのファイルのアップ...

Linux nlコマンドの使い方

1. コマンドの紹介nl (行数) は指定されたファイルに行番号を追加し、標準出力に書き込みます。フ...

node.js で PC 上の WeChat アプレット パッケージを復号化するための処理アイデア

目次アプレットのソースコードはどこにありますか? PC ミニプログラムはどのように暗号化されますか?...

Linux での Centos7 ファイアウォールの基本的な使用方法の詳細な説明

1. ファイアウォールの基本的な使い方起動する: systemctl は、firewalld を起動...

マウスをホバーすると画像が折りたたまれる効果を実現する CSS

マウスをホバーすると画像が折りたたまれる効果を実現する CSS 1. 実施のポイント折り畳みは複数の...

Nginx 最適化サービスで Web ページ圧縮を実装する方法

リソースを節約するためにWebページの圧縮を設定する1.まず、設定を変更しましょう vim /usr...

Vue プロジェクト @change 複数のパラメータを使用して複数のイベントを渡す

まず、変更イベントは 1 つだけです。 changelevel() //値を選択選択を変更して行の値...

CSS テキスト配置実装コード

フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...