当前位置:   article > 正文

c++中thread::join()与thread::detach()区别_thread detach

thread detach

thread::join()与thread::detach()方法两者区别在于主线程是否被阻塞。
使用thread::join()释放线程后,由系统分配给该线程的内存全部被清空并释放,所以只能执行一次,但是再执行join之前,主线程不能做其他事情。
使用thread::detach()方法后,将导致与指向该线程的指针分离,即主线程失去了对该线程的控制,主线程并不需要等待该线程结束而结束,该线程会再执行结束之后自行释放空间。
用代码表示如下:
没有加入线程效果

void hellowworld()
{
	int i = 10;
	while (i--)
	{
		cout << " hello world" << endl;
	}	
}

void helloguangzhou()
{
	int i = 10;
	while (i--) {
		cout << " hello guangzhou" << endl;
	}	
}
int main()
{
    hellowworld();
	helloguangzhou();
  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

输出是按着顺序输出的。

 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

加入线程并使用thread::join()释放效果

void helloguangzhou()
{
	int i = 10;
	while (i--) {
		cout << " hello guangzhou" << endl;
	}
	
}
void hellowworld()
{
	int i = 10;
	while (i--)
	{
		cout << " hello world" << endl;
	}

}
int main()
{
std::thread t(hellowworld);
	
	std::thread s(helloguangzhou);
	t.join();
	s.join();
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

输出和上面的例子不一样,它不是按顺序的,因为这两个线程在同时进行。

 hello world
 hello world
 hello world
 hello guangzhou
 hello guangzhou
 hello world
 hello world
 hello world
 hello world
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello world
 hello world
 hello world
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

加入线程并使用thread::detach()释放效果

void helloguangzhou()
{
	int i = 10;
	while (i--) {
		cout << " hello guangzhou" << endl;
	}
	
}
void hellowworld()
{
	int i = 10;
	while (i--)
	{
		cout << " hello world" << endl;
	}

}
int main()
{
std::thread t(hellowworld);
	
	std::thread s(helloguangzhou);
	t.detach();
	s.detach();
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

输出只有几行甚至没有输出,因为子线程正在执行还没有执行完,主线程就结束了,所有看不到输出。

hello guangzhou
 hello guangzhou
  • 1
  • 2

如果在return 之前加一句代码,让主线程延迟结束,即可看到完整输出。

std::thread t(hellowworld);
	
	std::thread s(helloguangzhou);
	t.detach();
	s.detach();
	std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果

hello world hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello world
 hello world
 hello world

 hello guangzhou
 hello guangzhou
 hello world
 hello world hello guangzhou

 hello world
 hello guangzhou
 hello world
 hello world
 hello guangzhou
 hello world
 hello guangzhou
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/1014216
推荐阅读
相关标签
  

闽ICP备14008679号