热爱互联网

goroutine和C++ thread的生存期比较

goroutine 会一直存在直到主程序退出。
只有main函数return时,才会结束所有的goroutine,当然已经运行完的goroutine除外。

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
27
28
29
30
31
package main
 
import (
	"fmt"
	"time"
)
 
func f() {
	fmt.Println("f()")
}
 
func test() {
	fmt.Println("begin test()")
	go f()
	fmt.Println("end test()")
}
 
func main() {
	test()
	time.Sleep(2 * time.Second)
	fmt.Println("end main()")
}
 
/*
 
begin test()
end test()
f()
end main()
 
*/

用C++11做下类比,C++中的thread默认的生存周期和创建它的函数是一样的,同样也是异步调用,但需要通过 join() 来等待thread结束,或者通过 detach() 使其独立运行直到main函数结束。
下面这个代码运行是会崩溃的,test()函数结束后,线程t会被强制结束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <thread>
#include <Windows.h>
 
void f(int i, double d)
{
	std::cout << i << " " << d << " "<< std::endl;
}
 
void test()
{	
	std::thread t(f, 21, 13.14);
	std::cout << "end test()" << std::endl;
}
 
int main()
{
	test();
	Sleep(2000);
	return 0;
}

可以调用join()等待线程t,或者调用detach()使t脱离它的创建者test()独立运行,直到main()结束.

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
27
28
29
#include <iostream>
#include <thread>
#include <Windows.h>
 
void f(int i, double d)
{
	std::cout << i << " " << d << " "<< std::endl;
}
 
void test()
{	
	std::thread t(f, 21, 13.14);
	//t.join();
	t.detach();
	std::cout << "end test()" << std::endl;
}
 
int main()
{
	test();
	Sleep(2000);
	return 0;
}
 
/*
	输出:
	end test()
	21 13.14
*/

Post a Comment

Your email is kept private. Required fields are marked *