问题标题: 多线程(C++标准库std::thread)

6
6
Xgugugu
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追加了内容

@酷町扫地僧 这不算完整代码吧...

 

顺便问一下,有人知道能不能在比赛里使用这个么?

(搜索用这个效率直接**)


0
0
0
0
李子杰
李子杰
资深光能
资深光能

已赞

李子杰在2021-12-18 12:44:49追加了内容

+1

0
0
我要回答