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
}
线程从创建开始就会开始执行,例如上面的例子中线程t1
和t2
在thread 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
}