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

推薦する

Dockerコンテナ間のホスト間通信 - オーバーレイベースの実装方法

オーバーレイネットワーク分析組み込みのホスト間ネットワーク通信は、常に Docker の待望の機能で...

JavaScript キャンバスはマウスの動きに合わせてボールを動かすことを実装します

この記事の例では、マウスに従ってボールを動かすjsの具体的なコードを参考までに共有しています。具体的...

デザイン理論:テキスト表現とユーザビリティ

<br />テキストデザインでは、通常、テキストのレイアウト、つまりテキストをより美しく...

MySQL 最適化の概要 - クエリエントリの合計数

1. COUNT(*) と COUNT(COL) COUNT(*)は通常、主キーに対してインデックス...

Zabbix redis 自動ポート検出スクリプトは json 形式を返します

自動検出を行う際には、ポートなどの情報を取得してjson形式で返すスクリプトが必ず存在します。Red...

JS正規RegExpオブジェクトについての簡単な説明

目次1. RegExpオブジェクト2. 文法2.1 定義2.2 修飾子2.3 角括弧2.4 メタ文字...

Alibaba Cloud Centos7.X で外部にポートを開く方法

一言で言えば、大手メーカーからクラウド サーバーを購入する場合は、セキュリティ グループに移動して、...

JSはストップウォッチタイマーを実装します

この記事の例では、ストップウォッチタイマーを実装するためのJSの具体的なコードを参考までに共有してい...

Linux系でよく使われる運用・保守コマンド(まとめ)

目次1. システム監視2. ファイル操作3. ネットワーク通信4. システム管理仕事で必要なLinu...

ウェブデザインの達人がよく使うレスポンシブフレームワークを共有する(要約)

この記事では、Web デザインの達人がよく使用するレスポンシブ フレームワーク (概要) を紹介し、...

Webデザインチュートリアル(6):デザインへの情熱を持ち続ける

<br />前の記事:Webデザインチュートリアル(5):Webビジュアルデザイン。 1...

Tomcat CentOS インストールプロセス図

Tomcat CentOS インストールこのインストール チュートリアルでは、次の内容について説明し...

MySQL クイックデータ比較テクニック

MySQL の運用と保守において、R&D の同僚が 2 つの異なるインスタンスのデータを比較...

CentOS 8 VMware 仮想マシンがインターネットにアクセスするための静的 IP ネットワーク カードの設定の詳細な説明

最初のステップ: VMwareで、「編集」-「仮想ネットワークエディタ」をクリックします。下図に示す...

React Nativeの起動プロセスの詳細分析

はじめに: この記事ではreact-native-cliで作成したサンプル プロジェクト (Andr...