当前位置: 首页 > news >正文

C++线程库的基本使用(初级)

#include<iostream>
#include<thread>
#include<string>
void printHelloWorld(std::string msg)
{std::cout << msg<< std::endl;return;
}
int main()
{std::thread threadl(printHelloWorld,"Hello Thread");//第一个参数是函数名,第二个参数是上一个函数的参数threadl.join();//检查子线程有无return,等子线程结束后,主线程才会继续//threadl.detach();//分离主线程和子线程,主线程和子线程同时进行,主线程运行完之后或子线程结束后释放资源bool isJoin = threadl.joinable();//该函数判断线程能否使用join,detach//join只能使用一次,joinable判断有没有使用过joinreturn 0;
} 
几个需要注意的点:

1.thread参数是引用时:

#include<iostream>
#include<thread>
void foo(int& x)
{x += 1;
}
int main()
{int a = 1;std::thread t(foo, std::ref(a));//使用std::ref()来告诉thread,这个参数是引用t.join();std::cout << a << std::endl;return 0;
} 

2.thread参数是不存在的:

#include<iostream>
#include<thread>
std::thread t;
void foo(int& x)
{x += 1;
}
void test()
{int a = 1;t = std::thread(foo, std::ref(a));
}
int main()
{test();t.join();//a是test函数的局部变量test结束后a已经被释放了//这个线程已经引用不了a了,所以报错return 0;
} 
#include<iostream>
#include<thread>
void foo(int* x)
{std::cout << *x << std::endl;//x现在是野指针
}
int main()
{int* ptr = new int(1);std::thread t(foo, ptr);delete ptr;//此时子线程和主线程同时运行,子线程在运行时,x所指的已经被释放了,子线程运行需要一定的时间t.join();//主线程等待子线程运行结束return 0;
} 

注意:在C++中,std::thread的构造函数要求第一个参数是一个可调用的对象(函数指针、函数名、lambda表达式等),而不是一个类的成员函数。成员函数需要使用类的对象来调用,因此不能直接作为std::thread的参数。(成员函数不是函数名,是因为成员函数是与类对象相关联的函数,它需要一个类的对象来调用。而函数名只是一个标识符,可以与任何类型的函数相关联,包括成员函数和非成员函数。)

#include <iostream>
#include <thread>
class A {
public:void foo(){std::cout << "Hello" << std::endl;}
};
int main() {A a;std::thread t(&A::foo, &a);t.join();return 0;
}

可以用智能指针来防止内存泄漏

#include <iostream>
#include <thread>
class A {
public:void foo(){std::cout << "Hello" << std::endl;}
};
int main() {std::shared_ptr<A> a = std::make_shared<A>();std::thread t(&A::foo, a);t.join();return 0;
}

锁:

#include <iostream>
#include <thread>
#include <mutex>
int a = 0;
std::mutex mtx;
void func()
{for (int i = 0; i < 10000; i++){mtx.lock();a += 1;mtx.unlock();}
}
int main() {std::thread t1(func);std::thread t2(func);t1.join();t2.join();std::cout << a << std::endl;return 0; 
}

http://www.lryc.cn/news/222481.html

相关文章:

  • 2023最新版JavaSE教程——第1天:Java语言概述
  • PTL货位指引标签为仓储管理打开新思路
  • IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven核心概念
  • Unity的粒子总是丢材质
  • P5906 【模板】回滚莫队不删除莫队
  • 1. Collection,List, Map, Queue
  • rabbitmq 交换机相关实例代码
  • 第四章IDEA操作Maven
  • Go语言函数签名和匿名函数
  • Pytest系列(16)- 分布式测试插件之pytest-xdist的详细使用
  • 基于JavaWeb的网上销售系统设计与实现
  • wpf添加Halcon的窗口控件报错:下列控件已成功添加到工具箱中,但未在活动设计器中启用
  • antv/x6 自定义html节点并且支持动态更新节点内容
  • 设计模式之命令模式
  • Linux学习笔记--高级
  • 在Java中操作Redis
  • 【服务器】fiber协程模块
  • SparkML
  • 实时定位与路径优化:跑腿App系统开发中的地理信息技术
  • Tomcat的HTTP Connector
  • 将Pytorch搭建的ViT模型转为onnx模型
  • 图神经网络(GNN)性能优化方案汇总,附37个配套算法模型和代码
  • 国科大移动互联网考试资料(2023+2020+2018真题+答案)
  • ModStart系统安全规范建议
  • 【漏洞复现】Django_debug page_XSS漏洞(CVE-2017-12794)
  • Redis性能调优:深度剖析与示例解析
  • oracle查询前几条数据的方法
  • c#弹性和瞬态故障处理库Polly
  • 20231107-前端学习炫酷菜单效果和折叠侧边栏
  • 基于CLIP的图像分类、语义分割和目标检测