文章目录
- 学习C++提供的线程库的原因
- 线程相关的类
- 线程初始化
- 线程获取自身线程ID
- 线程让出自身时间片
- 互斥锁的基本使用
- 条件变量的基本使用
学习C++提供的线程库的原因
- Linux 提供的 pthread_create等线程相关函数无法在windows上使用, C++提供的线程相关函数可以跨平台使用
- C++使用了面向对象的思想进行了封装,相关线程方法更容易使用 。
线程相关的类
// 调用常用方法的类
// thread对象、mutex对象均不允许拷贝,但允许移动赋值/构造。
std::thread
std::mutex
std:condition_variable
线程初始化
线程初始化 :
// 线程初始
// 使用函数指针初始化线程
// threadFunction 为启动的线程函数
// x1, x2 为更具threadFunction形参传入的参数,如果threadFunction没参数就不传入
std::thread t1(threadFunction, x1, x2);
线程批量初始化:
方案一:
const int numThreads = 5;
std::thread threads[numThreads]; // 创建多个线程对象
// 启动多个线程
for (int i = 0; i numThreads; ++i)
{ // 启动线程,执行 threadFunction(i) // 一定为移动赋值
threads[i] = std::thread(threadFunction, i);
}
// 等待所有线程执行完毕
for (int i = 0; i numThreads; ++i)
{
// 线程回收
threads[i].join();
}
方案二
vectorstd::thread> treadPool//创建
for (int i = 0; i threadPool.size(); ++i)
{
// 一定为移动赋值 //启动线程
thradPool[i] = std::thread(threadFunction, i);
}
// 等待所有线程执行完毕
for (int i = 0; i numThreads; ++i)
{
threads[i].join();
}
线程获取自身线程ID
#include
#include
void threadFunction()
{
// 注意std::thread::id为线程库中的类型
std::thread::id this_id = std::this_thread::get_id();
std::cout "Thread ID: " this_id std::endl;
}
int main()
{
std::thread t(threadFunction);
t.join();
return 0;
}
线程让出自身时间片
void threadFunction()
{
for (int i = 0; i 5; ++i)
{
std::cout "Thread A executing..." std::endl;
std::this_thread::yield(); // 让出当前线程的执行
}
}
int main()
{
std::thread t(threadFunction);
for (int i = 0; i 5; ++i)
{
std::cout "Main thread executing..." std::endl;
std::this_thread::yield(); // 让出当前线程的执行
}
t.join();
return 0;
}
互斥锁的基本使用
cpp
#include
#include
#include
// 创建一个互斥锁对象
std::mutex mtx;
void threadFunction(){
// 在需要保护共享资源的代码块前后分别加锁和解锁
mtx.lock();
std::cout "Thread A executing..." std::endl;
mtx.unlock();
}
int main()
{
std::thread t(threadFunction);
// 在需要保护共享资源的代码块前后分别加锁和解锁
mtx.lock();
std::cout "Main thread executing..." std::end服务器托管l;
mtx.unlock();
t.join();
return 0;
}
条件变量的基本使用
#include
#include
// 条件变量是通过锁来实现的
#include
#include
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void threadFunction()
{
std::unique_lockstd::mutex> lock(mtx);
// 等待条件满足
cv.wait(lock, []{ return ready; });
std::cout "Thread A executing..." std::endl;
}
int main()
{
std::thread t(threadFunction);
{
// 出作用域自动解锁
std::lock_guardstd::mutex>服务器托管; lock(mtx);
// 设置条件为true
ready = true;
}
// read已经被修改为true 通知等待的线程可以开始执行
cv.notify_one();
t.join();
return 0;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
先说一下自己的情况,本科生,19年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个服务器托管网企业干了2年的功能测试,已经让我变得不思进取,谈了2年的女朋友也因为我…