在上一篇文章C++11多线程学习1中的代码,我们使用了join。但是其实使用detach也是一样的结果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
int _tmain(int argc, _TCHAR* argv[])
{
	std::thread t1(test, "t1", 1000);
	std::thread t2(test, "t2", 1500);
	t1.join(); // detach()
	t2.join(); // detach()

	char ch;
	std::cin >> ch;
	return 0;
}

无论是join和detach其结果都是: 结果2

但是如果换成这份代码,结果就不同了。

 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
32
33
34
35
36
37
38
class test
{
public:
	test() { n = 0; }
	~test() {}

public:
	void testcout(const std::string& str, int time)
	{
		for (int i = 0; i < 10; i++)
		{
			Sleep(time);
			std::cout << str.c_str() << i << std::endl;
			n++;
		}
		std::cout << str.c_str() << &n << std::endl;
	}

private:
	int n;
};

void testtest(const std::string& str, int time)
{
	test te;
	std::thread t(&test::testcout, te, str, time);
	t.detach();
}

int _tmain(int argc, _TCHAR* argv[])
{
	testtest("t1", 500);
	testtest("t2", 700);

	char ch;
	std::cin >> ch;
	return 0;
}

detach的结果依然为 结果2

但是join的结果就成了 结果3

以我的理解,结束语句块的时候(比如说函数结束)……主线程会一直等着join的线程,然后一起结束。但是detach的线程因为已经脱离了控制,所以主线程不会等他。