c++ 线程

在 C++ 中,std::thread 构造函数可以用于将参数传递给线程。这里是一个基本的示例,展示了如何使用 std::thread 来传递参数:

#include <iostream>
#include <thread>// 定义一个被线程调用的函数
void threadFunc(int arg1, double arg2, std::string arg3) {std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
}int main() {// 创建一个线程,并传递参数std::thread t(threadFunc, 1, 3.14, "Hello, World!");// 等待线程结束t.join();return 0;
}

在这个例子中,定义了一个函数 threadFunc,它接受三个参数。然后在 main 函数中创建了一个线程,并将这三个参数传递给了 threadFunc

如果函数参数是引用类型,可以使用 std::refstd::cref 来传递引用:

#include <iostream>
#include <thread>
#include <functional> // std::ref 和 std::cref 需要这个头文件// 定义一个被线程调用的函数
void threadFunc(int &arg1, double &arg2, std::string &arg3) {std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
}int main() {int arg1 = 1;double arg2 = 3.14;std::string arg3 = "Hello, World!";// 创建一个线程,并传递参数引用std::thread t(threadFunc, std::ref(arg1), std::ref(arg2), std::ref(arg3));// 等待线程结束t.join();return 0;
}

在这个例子中,使用 std::ref 来传递变量的引用,这样就可以在 threadFunc 中修改这些变量的值。

std::refstd::cref 是 C++11 引入的,用于在函数绑定或异步函数调用中引用成员函数或者非成员函数。这些函数主要在多线程中使用,目的是在函数调用中保持对象的引用,而不是复制对象。

std::refstd::cref 的使用

  1. std::ref:
    std::ref 用于在函数绑定或异步函数调用中引用非 const 对象。例如:

    std::thread t(func, std::ref(myObj));
    
  2. std::cref:
    std::cref 类似于 std::ref,但它用于引用 const 对象。例如:

    std::thread t(func, std::cref(myObj));
    

这两个函数都定义在 <functional> 头文件中,因此在使用它们之前,必须包含这个头文件。

多线程示例

以下是一个示例,展示了如何使用 std::threadstd::promise 进行线程同步:

#include <iostream>
#include <thread>
#include <future>
#include <string>int main() {std::promise<std::string> promise;std::future<std::string> future = promise.get_future();std::thread t([&promise] {std::string s = "hello";std::this_thread::sleep_for(std::chrono::seconds(1));promise.set_value(s);});t.join();std::string value = future.get();std::cout << value << std::endl;return 0;
}

使用信号量的多线程示例

下面是一个使用信号量和互斥锁进行线程同步的示例:

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <semaphore.h>std::mutex mtx;
sem_t sem;
int counter = 0;void increment_counter(int id) {sem_wait(&sem);std::lock_guard<std::mutex> lock(mtx);std::this_thread::sleep_for(std::chrono::milliseconds(100));counter++;std::cout << "Thread " << id << " incremented counter to " << counter << std::endl;sem_post(&sem);
}void read_counter(int id) {sem_wait(&sem);std::lock_guard<std::mutex> lock(mtx);std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout << "Thread " << id << " read counter value " << counter << std::endl;sem_post(&sem);
}int main() {sem_init(&sem, 0, 5);std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {if (i % 2 == 0) {threads.push_back(std::thread(increment_counter, i));} else {threads.push_back(std::thread(read_counter, i));}}for (auto &thread : threads) {thread.join();}sem_destroy(&sem);return 0;
}

在这个示例中,使用了信号量和互斥锁来控制对共享资源 counter 的访问。这样可以确保多个线程安全地访问和修改共享资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++多线程编程中的锁详解

在现代软件开发中&#xff0c;多线程编程是提升应用程序性能和响应能力的重要手段。然而&#xff0c;多线程编程也带来了数据竞争和死锁等复杂问题。为了确保线程间的同步和共享数据的一致性&#xff0c;C标准库提供了多种锁机制。 1. std::mutex std::mutex是最基础的互斥锁…

视图、存储过程、触发器

一、视图 视图是从一个或者几个基本表&#xff08;或视图&#xff09;导出的表。它与基 本表不同&#xff0c;是一个虚表&#xff0c;视图只能用来从查询&#xff0c;不能做增删改(虚拟的表) 1.创建视图 创建视图的语法&#xff1a; create view 视图名【view_xxx / v_xxx】 a…

深入理解MySQL锁机制与性能优化:详解记录锁、间隙锁、临键锁及慢SQL查询分析

1. 事务隔离和锁机制详解 记录锁 第一种情况,当我们对于唯一性的索引(包括唯一索引和主键索引)使用等值查询,精准匹配到一条记录的时候,这个时候使用的就是记录锁。 比如 where id = 1 4 7 10。 间隙锁 第二种情况,当我们查询的记录不存在,无论是用等值查询还是范围…

如何使用 API 查看极狐GitLab 镜像仓库中的镜像?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

Thinkphp开发文档二次整理版

基础部分 安装 环境要求 ​ *php>7.1.0 命令下载 通过Composer进行下载&#xff0c;操作步骤下载软件 phpstudy --->点击软件管理 --->安装Composer --->再点击网站 --->点击管理 --->点击Composer --->复制如下命令代码&#xff1a; ​ 稳定版&…

国际化技术参考

一、概述 国际化就是用户可以选择对应的语言,页面展示成对应的语言; 一个系统的国际化按照信息的所在位置,可以分为三种国际化信息: 前端页面信息后端提示信息数据库的字典类信息二、前端页面国际化 使用i18n库实现国际化 i18n国际化库思路:通过jquery或者dom操作拿到需…

推荐4款简单高效的视频转文字工具。

最近我要将很多的以前的培训视频转换成笔记&#xff0c;觉得很麻烦&#xff0c;于是就搜索有没有什么工具可以帮助。结果就真的找到了很多将视频转换成文字的软件和网站。解决了一个大工程&#xff0c;后来发现其实很多人都会碰到像我这样的问题&#xff0c;于是在这里将我使用…

【前端】JavaScript入门及实战106-110

文章目录 106 a的索引问题107 使用DOM操作CSS108 读取元素当前的样式109 getStyle()110 其他样式操作的属性滚动条练习 106 a的索引问题 <!DOCTYPE html> <html> <head> <title></title> <meta charset"utf-8"> <script typ…

HR问:前端实习生简历实习筛不了,一天上百份,但是都一样,怎么办?

前两天&#xff0c;我们HR过来问&#xff1a;“前端的实习生投的实在太多了&#xff0c;一天下来就几百份了&#xff0c;怎么办&#xff1f;” 我大致看了看这些简历发现&#xff0c;这几百份的简历除了学校不同之外&#xff0c;几乎没有什么区别。 如何筛选&#xff1f; 有…

类和对象:完结

1.再深构造函数 • 之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函数初始化还有⼀种⽅ 式&#xff0c;就是初始化列表&#xff0c;初始化列表的使⽤⽅式是以⼀个冒号开始&#xff0c;接着是⼀个以逗号分隔的数据成 员列表&#xf…

通信原理-思科实验三:无线局域网实验

实验三 无线局域网实验 一&#xff1a;无线局域网基础服务集 实验步骤&#xff1a; 进入物理工作区&#xff0c;导航选择 城市家园; 选择设备 AP0&#xff0c;并分别选择Laptop0、Laptop1放在APO范围外区域 修改笔记本的网卡&#xff0c;从以太网卡切换到无线网卡WPC300N 切…

【C#/C++】C#调C++的接口,给C++传结构体数组

C#调C的接口&#xff0c;给C传结构体数组 1、背景2、实现 1、背景 C#软件创建了一个结构体数组用来存储图像的区域信息&#xff0c;分别是矩形框的左上像素的xy坐标和矩形框右下像素的xy坐标。需要传入给调用的C函数的参数列表中&#xff0c;我们选择使用C#传入一个结构体数组…

力扣Hot100-543二叉树的直径

给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5] 输出&a…

C++ 基础(类和对象下)

目录 一. 再探构造函数 1.1. 初始化列表&#xff08;尽量使用列表初始化&#xff09; 二. static成员 2.1static成员初始化 三.友元 3.1友元&#xff1a;提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫…

2024.7.24 作业

1.二叉树的创建、遍历自己实现一遍 bitree.h #ifndef BITREE_H #define BITREE_H#include <myhead.h>typedef char datatype;typedef struct Node {datatype data;struct Node *left_child;struct Node *right_child; }Node,*BiTreePtr;//创建二叉树 BiTreePtr tree_cr…

我在百科荣创企业实践——简易函数信号发生器(5)

对于高职教师来说,必不可少的一个任务就是参加企业实践。这个暑假,本人也没闲着,报名参加了上海市电子信息类教师企业实践。7月8日到13日,有幸来到美丽的泉城济南,远离了上海的酷暑,走进了百科荣创科技发展有限公司。在这短短的一周时间里,我结合自己的教学经验和企业的…

【Java语法基础】9.异常处理

9. 异常处理 Error是程序无法处理的错误&#xff0c;出现时线程被JVM终止。 Exception&#xff0c;指的是程序运行时可以处理的异常。其继承关系如下表&#xff1a; 运行时异常&非运行时异常 运行时异常 都是RuntimeException类及其子类异常&#xff0c;如NullPointerE…

java中涉及到的基础数据结构

1. BST(二叉搜索树),AVL(平衡二叉树)、RBT(红黑树) 二叉查找树(BST) 左结点小于根节点&#xff0c;右结点大于根节点的一种排序树&#xff0c;也叫二叉搜索树。也叫BST&#xff0c;英文Binary Sort Tree。 二叉查找树比普通树查找更快&#xff0c;查找、插入、删除的时间复杂…

模拟实现c++中的string

c内置string库的相关函数&#xff1a;string - C Reference 目录 一string类构造&#xff0c;拷贝构造和析构&#xff1a; 二string内正向迭代器实现&#xff1a; 三赋值运算符重载实现&#xff1a; 四reserve&#xff0c;empty&#xff0c;clear实现&#xff1a; 五push_b…

动手学深度学习——6.循环神经网络

1.序列模型 处理序列数据需要统计工具和新的深度神经网络架构。 为了简单起见&#xff0c;我们以 图8.1.1所示的股票价格&#xff08;富时100指数&#xff09;为例。 图8.1.1 近30年的富时100指数 其中&#xff0c;用&#x1d465;&#x1d461;表示价格&#xff0c;即在时间…