c++ 线程使用
C++中的线程可以通过标准库提供的thread类实现。该类提供了创建和管理线程的方法和函数。
创建线程的方法:
#include <thread>
...
// 创建一个线程,其执行函数为func1,传递参数为arg1
std::thread t1(func1, arg1);
// 创建一个线程,其执行函数为func2
std::thread t2(func2);
// 等待t1执行完毕
t1.join();
// 等待t2执行完毕
t2.join();
上述代码中,func1和func2代表函数指针,arg1是传递给func1的参数,t1和t2是线程对象,join()方法用于等待线程执行完毕。
线程函数的定义:
线程函数可以是任何可调用对象,包括函数指针、函数对象、lambda表达式等。线程函数的实现需要注意线程安全问题。
#include <iostream>
#include <thread>
void worker(int id)
{
std::cout << "Worker " << id << " is starting..." << std::endl;
// 执行任务
std::cout << "Worker " << id << " is finished." << std::endl;
}
int main()
{
std::thread t1(worker, 1);
std::thread t2(worker, 2);
// 等待t1执行完毕
t1.join();
// 等待t2执行完毕
t2.join();
return 0;
}
如上述代码所示,worker函数用于执行具体的任务,通过std::thread对象创建线程,将worker函数作为线程执行函数,并传入参数,通过join()方法等待线程执行完毕。
线程的同步与互斥:
在多线程程序中,很容易出现多个线程同时访问同一个数据或资源的情况,这时就需要对线程进行同步和互斥操作,以避免数据竞争等问题。
在C++中,提供了一些同步和互斥的机制,如:互斥锁、条件变量、原子操作等。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex m;
void worker(int id)
{
// 加锁
m.lock();
std::cout << "Worker " << id << " is starting..." << std::endl;
// 执行任务
std::cout << "Worker " << id << " is finished." << std::endl;
// 解锁
m.unlock();
}
int main()
{
std::thread t1(worker, 1);
std::thread t2(worker, 2);
// 等待t1执行完毕
t1.join();
// 等待t2执行完毕
t2.join();
return 0;
}
如上述代码所示,为线程添加互斥锁可以避免多个线程同时访问同一个数据或资源的问题,执行互斥锁加锁和解锁操作就可以实现线程之间的同步和互斥。
总结:
C++中提供了thread类实现线程的创建和管理,线程函数可以是任何可调用对象。在多线程编程中,需要注意线程安全问题,可以通过互斥锁、条件变量等机制实现线程之间的同步和互斥。
c++ 线程使用的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java 线程
线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
随机推荐
- 谁来拯救存量SGX1平台?又一个内核特性合并的血泪史
简介: 今天的故事主角,是一个被称为Flexible Launch Control的SGX平台特性. 前言 自从Intel内核开发人员Jarkko Sakkinen于2017年9月2日在inte ...
- 快手基于 Flink 构建实时数仓场景化实践
简介: 一文了解快手基于 Flink 构建的实时数仓架构,以及一些难题的解决方案. 本文整理自快手数据技术专家李天朔在 5 月 22 日北京站 Flink Meetup 分享的议题<快手基于 F ...
- Jaeger插件开发及背后的思考
简介: 本文主要介绍Jaeger最新的插件化后端的接口以及开发方法,让大家能够一步步的根据文章完成一个Jaeger插件的开发.此外SLS也推出了对于Jaeger的支持,欢迎大家试用. 随着云原生 + ...
- Puppeteer 入门与进阶: 快速上手
Puppeteer API: https://puppeteer.bootcss.com/api 1. 安装: $ yarn add puppeterr 2. 网页截图实例: // main.jsco ...
- WPF 全屏窗口将让 Chrome 97 视频停止播放
无论是使用 WPF 全屏窗口,还是高性能全屏透明窗口,都会在 Chrome 97 以及使用 chromium 对应版本内核的应用的视频停止播放.这是 chromium 的一个优化,因为 chromiu ...
- 什么是IPD项目管理模式?聊聊IPD下的产品研发流程
IPD(集成产品开发)涵盖了产品从创意提出到研发.生产.运营等,包含了产品开发到营销运营的整个过程.围绕产品(或项目)生命周期的过程的管理模式,是一套生产流程,更是时下国际先进的管理体系.IPD(集成 ...
- LVGL SCROLL循环滚动
一.案例测试 这里我使用LVGL的版本是8.3.3 运行案例 lvgl_examples\scroll\lv_example_scroll_6 效果如下所示 二.现象 这里先描述一下现象,当我们使用 ...
- Excel根据名称批量导入图片
一. 效果 二.方法一 在Excel中如果内容 ="<table><img src=""D:\文档\常用文件\图片导入测试\"&A2& ...
- M9K内存使用教程
M9K内存使用教程 M9K内存是Altera内嵌的高密度存储阵列.现代的FPGA基本都包含类似的不同大小的内存. M9K的每个块有8192位(包含校验位实际是9216位).配置灵活.详细了解M9K可参 ...
- pde复习笔记 第一章 波动方程 第三节 分离变量法
教材 谷超豪<数学物理方程>第四版,虽然我们老师用的第三版,但是除了页码对不上,习题多了一点,也似乎没有多少区别. 打算开个新栏专门总结一下pde的各种计算问题,在图书馆算的手麻了,但是习 ...