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

推薦する

Macでのファイル権限の表示と設定の詳細な説明

序文Mac システムのターミナルでファイルの権限を変更するには、Linux の chmod コマンド...

サラウンドリフレクションロード効果を実現するHTML+CSS

この記事では、主に html + css を使用してサラウンド リフレクション ローディング エフェ...

DockerとFastDFSのインストールコマンドと使い方の詳しい説明

Dockerの機能1) すぐに始められるユーザーがプログラムを「Docker 化」するには、わずか数...

MySQL 5.6 マスタースレーブエラー報告の実践記録

1. 問題の症状バージョン: MySQL 5.6、従来の binlog ファイルと pos 方式を使...

Vue の高度な構築プロパティの詳細な説明

目次1. ディレクティブカスタムディレクティブ2. ミックスイン3. 継承を拡張する4. 提供して注...

MySQL 5.7.19 のインストールと設定方法のグラフィック チュートリアル (win10)

以下に記録されているように、WIN10システムにMYSQLをダウンロードしてインストールするための詳...

ブラウザの自動フォーム入力によるウェブページのスタイル損失の原因の分析と解決

バックエンドからフロントエンドまで、なんと悲劇なのでしょう。他の人の CSS を自分の jsp We...

Linux でファイルの権限 (所有権) を変更する

Linux と Unix はマルチユーザー オペレーティング システムであるため、ファイルの権限と所...

MySQL SQL文の特殊処理文のまとめ(必読)

1.テーブル全体を更新します。データ行の列の値が空の場合は、別の列フィールドの値と同じにします。 ...

Linux は n 日前のログとサンプルコマンドを自動的に削除します

1. ファイル削除コマンド:対応するディレクトリを検索します -mtime + 日数 -name &...

HTML コード作成ガイド

共通コンベンションタグ自己終了タグ。閉じる必要はありません (例: img input br hr ...

MySQLのSQLモードの特徴のまとめ

序文SQL モードは、MySQL がサポートする SQL 構文と、実行されるデータ検証チェックに影響...

UTF-8 ファイルの Unicode 署名 BOM (バイト オーダー マーク) の問題

最近、UTF8 エンコードの中国語 Zen Cart Web サイトをデバッグしているときに奇妙な現...

phpmyadmin を使用して MySQL 権限を設定する方法

目次ステップ 1: root ユーザーとしてログインします。ステップ 2: 新しいデータ テーブルを...

CSS を使用して適応型の幅と高さを持つ 16:9 の長方形を実装する例

先ほど、適応幅と高さが1:1の正方形を作成する方法について説明しました。 https://www.j...