日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

linux下多線程中的fork介紹_Linux

更新時間: 2021-12-14 編程語言

問題提出:

回想一下:當一個程序只有主線程的時候調用fork,此時fork會創建出的子進程也會只有一條線程;

那要是把fork放入多線程的程序中呢?

我們來試驗下:

情況(1)fork在創建子線程之前

代碼:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* pthread_fun(void* arg)
{
	printf("fun = %d\n", getpid());
	pthread_exit(NULL);
}
int main()
{
	fork();

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

	return 0;
}

結果:fork出的子進程也會創建自己的子線程(兩個進程:四個線程

在這里插入圖片描述

情況(2)fork在創建子線程之后

代碼:

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

void* pthread_fun(void* arg)
{
	printf("fun = %d\n", getpid());
	pthread_exit(NULL);
}
int main()
{

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

結果:創建子線程之后,再創建子進程,此時fork的子進程只會執行fork之后的代碼(兩個進程:三個線程

在這里插入圖片描述

情況(3)子線程中的fork

代碼:

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

void* pthread_fun(void* arg)
{
	fork();
	printf("fun = %d\n", getpid());
	pthread_exit(NULL);
}
int main()
{

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

	return 0;
}

結果:

在這里插入圖片描述

結論:

fork處于哪個線程中,fork后創建的子進程將以該線程作為自己的主線程,并且執行該線程之后的代碼

原文鏈接:https://blog.csdn.net/xiaoxiaoguailou/article/details/121615303

欄目分類
最近更新