cpp的多线程thread库

cpp的多线程库thread主要有三个函数:join()detach()joinable()

join函数

join()表示阻塞当前线程,把子线程加入并且等待子线程结束,才继续执行当前线程.

	#include <iostream>
	#include <thread>
	
	int sum = 0;
	
	void add(int a, int b) {
	    sum += a + b;
	
	}
	
	int main() {
	    int a = 5;
	    int b = 10;
	
	    std::thread t1(add, a, b);
	    std::thread t2(add, a, b);

	    std::cout << "Sum: " << sum << std::endl; // 输出结果:Sum: 0
	
	    t1.join();
	    t2.join();
	
	    std::cout << "Sum: " << sum << std::endl; // 输出结果:Sum: 30
	}

线程从创建开始就会开始执行,例如上面的例子中线程t1t2thread t1(add, a, b);创建时就开始执行,但是由于需要操作系统分配资源,需要一点时间。

而主线程并没有被阻塞,下面的 std::cout优先输出,输出结果为Sum: 0

而后面t1.join();语句导致主线程被阻塞,主线程需要等待t1、t2执行完成才会继续,最后打印的结果为Sum: 30

	#include <iostream>
	#include <thread>
	
	int sum = 0;
	
	void add(int a, int b) {
	    sum += a + b;
	
	}
	
	int main() {
	    int a = 5;
	    int b = 10;
	
	    std::thread t1(add, a, b);
	    std::thread t2(add, a, b);
	
	    std::this_thread::sleep_for(std::chrono::milliseconds(10));   
	    std::cout << "Sum: " << sum << std::endl; // 输出结果:Sum: 30
	
	    t1.join();
	    t2.join();
	
	    std::cout << "Sum: " << sum << std::endl; // 输出结果:Sum: 30
	}

为了证明线程从创建开始就会开始执行,我们在第一次打印之前加入一个休眠,调用chrono的库进行休眠10s,等待操作系统分配资源给t1、t2,然后打印的结果显示为Sum: 30,表明线程从创建开始就会开始执行,但是操作系统分配资源切换线程需要一点点时间。

	#include <iostream>
	#include <thread>
	
	int sum = 0;
	
	void add(int a, int b) {
	    sum += a + b;
	
	}
	
	int main() {
	    int a = 5;
	    int b = 10;
	
	    std::thread t1(add, a, b);
	    std::thread t2(add, a, b);
	
	    t1.detach();
	    t2.detach();
	
	    std::cout << "Sum: " << sum << std::endl; // 输出结果:Sum: 0
	}

detach函数

detach函数表示分离子线程和主线程,两个线程开始单独执行。

例如下面的例子,t1和t2和主线程单独执行,但是操作系统需要时间去分配资源给他们两个子线程,而主线程继续执行,第一次打印的结果为Sum: 0,第二次打印的结果就是Sum: 30

	#include <iostream>
	#include <thread>
	
	int sum = 0;
	
	void add(int a, int b) {
	    sum += a + b;
	
	}
	
	int main() {
	    int a = 5;
	    int b = 10;
	
	    std::thread t1(add, a, b);
	    std::thread t2(add, a, b);
	
	    t1.detach();
	    t2.detach();
	
	    std::cout << "Sum: " << sum << std::endl; // 输出结果:Sum: 0
	
	    std::this_thread::sleep_for(std::chrono::milliseconds(10));
	    std::cout << "Sum: " << sum << std::endl; // 输出结果:Sum: 30
	}

joinable函数

joinable是一个布尔类型的函数,返回一个子线程和主线程之间的关系,用来判断子线程是否已经加入或者被分离开主线程。

如果子线程一旦被join或者detach,joinable就将返回0

	#include <iostream>
	#include <thread>
	
	int sum = 0;
	
	void add(int a, int b) {
	    sum += a + b;
	
	}
	
	int main() {
	    int a = 5;
	    int b = 10;
	
	    std::thread t1(add, a, b);
	    std::thread t2(add, a, b);
	
	    std::cout << t1.joinable() << std::endl;   //返回1
	    std::cout << t2.joinable() << std::endl;   //返回1
	
	    t1.join();
	    t2.detach();
	
	    std::cout << t1.joinable() << std::endl;   //返回0
	    std::cout << t2.joinable() << std::endl;   //返回0
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏格拉没有底w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值