c++并发编程

在c++11之前,多线程编程需要调用windows的createThread、linux的pthread等平台专属PI,或使用Boost.Thread等第三方库。c++11首次接纳原生语言层面的多线程应用,让代码仅依赖c++标准,让多线程成为c++"天生就会"的能力,无需针对不同系统编写平台相关的代码,实现了跨平台的原生可移植性。大白话就是c++11的编译器升级了,可以识别std::thread、std::atomic、std::mutex、std::condition_variable等语句了,c++编译器和标准库接管了从"源代码逻辑"到"操作系统调用"再到"CPU指令重排序"的全过程。

c++里,函数参数可以是函数指针,而声明一个接收函数指针的函数时,有个简化写法:

声明函数参数时,直接写函数原型,编译器会自动将其解读为指向该函数的指针。

复制代码
// 写法1:显示声明函数指针参数
void func(backgroup_task(*fp)());
// 含义:func接收一个指针fp,fp指向无参数,返回backgroup_task的函数

// 写法2:简化写法(编译器会自动转换成写法1)
void func(backgroup_task());
// 编译器解读:和写法1完全等价,参数是无参数、返回backgroup_task的函数指针

这个是c++的语法糖,也是编译器把bankgroup_task()解析成函数指针的底层规则。

设计一个带有函数调用操作符的类:

cpp 复制代码
#include <iostream>
#include <thread>

void do_sameting(){
    std::cout << "do sameting" << std::endl;
}
class backgroup_task
{
    public:
    void operator()()const
    {
        do_sameting();
    }
};


int main(){
    backgroup_task f;
    std::thread my_thread(f);
    my_thread.join();
    return 0;
}

假设传入的是临时变量,而不是具名变量,程序员可能会想当然地写成以下

cpp 复制代码
    std::thread my_thread(backgroup_task());

程序员的意图是临时创建一个backgroup_task对象,向其构造函数传递的参数为空,将这个临时对象传递给my_thread创建一个thread对象。但是编译器会有另外的解读,它会把这句话解读为函数的命令,此函数的名字叫my_thread,返回类型是std::thread,传递的参数是一个入参为空,返回类型为backgroup_task的函数指针。于是造成了误解。

解决方法一(写出与程序员意图相符的代码):

cpp 复制代码
std::thread my_thread((backgroup_task()));

多加一层圆括号,圆括号()在c++中不能出现在函数参数声明的位置,因此编译器无法再把它解析成函数声明,只能认作是临时对象初始化

解决方法二:

cpp 复制代码
std::thread my_thread({backgroup_task()});

{}是c++11专门用来做对象初始化的语法,语义上直接排除了"函数声明"的可能,编译器会直接创建临时对象。

join简单而粗暴,要么一直等待线程结束,或者干脆完全不等待。如需选取更精细的粒度控制线程等待,如查验线程结束与否,或限定只等待一段时间,那我们便得改用其他方式,如条件变量和future。只要调用了join(),隶属于该线程的任何存储空间即会因此清除,std::thread对象遂不再关联到已结束的线程。事实上,它与任何线程均无关联。其中的意义是,对于某个给定的线程,join()仅能调用一次;只要std::thread对象曾经调用过join(),线程就不再可汇合(joinable)。

相关推荐
骑着蜗牛撵大象3277 小时前
告别内存泄漏:LLMManager架构设计与智能指针在AI SDK中的智慧选型
c++·ai·架构
quantdash_cc8 小时前
量化策略为什么需要实时行情数据?从信号产生到交易决策的时间差说起
开发语言·python·数据分析·量化交易·股票数据·quantdash
汉克老师8 小时前
CSP-J 2026 初赛试题解析(第二部分:阅读程序题(第一题))精讲
c++·csp-j·小学生·学c++编程
syagain_zsx8 小时前
算法基础篇 · 04 前缀和(C++ 题解)
c++·算法·前缀和
汉克老师9 小时前
CSP-J 2026 初赛试题解析(第三部分:完善程序题(第一题))精讲
c++·csp-j·小学生·学c++编程
逆向编程9 小时前
QGIS地图投影(CRS坐标参照系)设置
开发语言
free-elcmacom10 小时前
发际线警告!手撕《C陷阱与缺陷》终极 BOSS:signal 函数与 typedef 魔法
c语言·开发语言·visual studio code·visual studio
程序员阿鹏10 小时前
简单介绍一下软引用
java·开发语言·jvm·数据结构·后端
haluhalu.10 小时前
初识 Protobuf:微服务跨语言通信的一份契约
java·c语言·开发语言·c++·python
longxuan0110 小时前
倍增算法详解
c++·st表·倍增算法