thread的使用
用于多线程,常见搭配有mutex
锁;
需要用到的头文件:
#include <thread>
#include <mutex>
编译
g++ -std=c++11 -o demo.o demo.cpp -pthread
1.来个简单的demo-1.0
简单实现了两个线程分别去修改全局变量i并打印结果
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 声明一个锁来防止多线程的修改
int i = 0; // 声明一个全局变量i对其进行修改
void addOne(int id) {
mtx.lock();
++i;
std::cout << "Thread " << id << " added 1 to i. i is now " << i << std::endl;
mtx.unlock();
}
int main() {
std::thread t1(addOne, 1);//创建线程对象,并执行对应的函数
std::thread t2(addOne, 2);
t1.join();//等待t1执行完成,才进入接下来的主程序,不影响其他线程
t2.join();
return 0;
}
2. 升级版本demo-2.0
这里会导致线程安全的问题,所以加上了一个锁;
现在再来看看打印多个值时
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; //
int i = 0; //
void addOne(int id) {
mtx.lock();
for(int k = 0; k < 100;k++){
i++;
std::cout << "Thread " << id << " added 1 to i. i is now " << i << std::endl;
}
mtx.unlock();
}
int main() {
std::thread t1(addOne, 1);
std::thread t2(addOne, 2);
addOne(0);
t1.join();
t2.join();
return 0;
}
可以分别不加锁进行尝试:
- 加锁:分别执行,当先抢到资源的线程执行完,再释放给另外一个线程;
- 不加锁:不会占有资源,而且因为i++不是原子操作,所以可能出现最后的结果不是200;
demo-3.0
用以理解join和线程的资源分配
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
//函数1,睡五秒
void func1();
void func2();
void func3();
void func1()
{
cout << "func1 start" << endl;
this_thread::sleep_for(chrono::seconds(5));
cout << "func1 end" << endl;
}
//函数2,睡三秒
void func2()
{
cout << "func2 start" << endl;
this_thread::sleep_for(chrono::seconds(3));
cout << "func2 end" << endl;
}
//函数3,每隔1秒输出一次
void func3()
{
cout << "func3 start" << endl;
for (int i = 0; i < 6; i++)
{
this_thread::sleep_for(chrono::seconds(1));
cout << "1 s" << endl;
}
cout << "func3 end" << endl;
}
int main()
{
//创建线程
thread t1(func1);
thread t2(func2);
thread t3(func3);
//等待线程结束
t1.join();
t2.join();
t3.join();
return 0;
}