6
Xgugugu
新手守护
新手守护
一、头文件:
#include<thread>
二、编译须知:
请使用新版本devc++,否则可能导致编译错误(这是C++11的新特**,旧的编译器不支持)
三、使用:
1. 示例
#include<iostream>
#include<string>
#include<thread>
using namespace std;
void func_1(){
cout<<"Hello 1\n";
}
void func_2(){
cout<<"Hello 2\n";
}
void func_3(int x,string str){
cout<<str<<x<<endl;
}
int main(){
thread t1(func_1); //创建后传入了一个执行函数
t1.join(); //join():等待线程执行完成后,才继续执行
thread t2(func_2);
t2.detach(); //detach():将线程分离出来(对子线程没有控制权)线程执行完成后会自动释放掉资源。
string str="Hello ";
thread t3(func_3,3,str); //传入了两个参数
t3.join();
thread t4([&str]{ //更现代的方式传递执行函数(Lambda)不在参数前加&无法操作参数的值
cout<<str<<4<<endl;
str="2333";
});
t4.join();
cout<<str;
return 0;
}
2. 成员函数
get_id()
获取线程的ID,返回一个类型为std::thread::id的对象
joinable()
**线程是否能被join(如果没有被分离则是可以join的)
swap()
交换两个线程对象的底层句柄(参数:两个线程对象)
3. 资源加锁
当几个线程同时操作一个变量时,就有可能发生错误
c++提供了几种资源加锁方式,这里只介绍独占式的(其他的我认为基本没用)
头文件(再来一次):
#include<mutex>
使用:
#include<iostream>
#include<string>
#include<thread>
#include<mutex>
#include<windows.h>
using namespace std;
mutex m;
int main(){
int num=0;
thread t1([&num]{
m.lock(); //加锁
cout<<"t1正在执行\n";
Sleep(1000);
cout<<"t1执行了\n";
num=12121;
m.unlock(); //解锁
});
thread t2([&num]{
lock_guard <mutex> l(m); //等待解锁
cout<<"t2执行了\n";
num=23232;
});
t2.join();
t1.join();
cout<<"num="<<num;
return 0;
}
本帖参考了:https://www.runoob.com/w3cnote/cpp-std-thread.html(菜鸟教程,原文写的人看了要吐)
还有一些小函数没有介绍,自己去看菜鸟教程吧:
yield()
sleep_until()
sleep_for()
Xgugugu在2021-11-12 20:59:45追加了内容
@酷町扫地僧 这不算完整代码吧...
顺便问一下,有人知道能不能在比赛里使用这个么?
(搜索用这个效率直接**)