function模板类的实现,bind绑定方法,线程的使用

本文介绍了C++中线程的使用,特别强调了在线程传引用时需要添加`ref`。此外,探讨了如何通过`bind`函数将函数和参数打包成新的函数,以应用于线程池场景。同时,详细阐述了如何实现`function<>`模板类,包括存储函数地址和可调用对象,并展示了从仅存储函数指针到自定义模板类的两个版本实现过程。
摘要由CSDN通过智能技术生成

C++线程的使用

线程传引用的时候要加ref 线程类将一个函数和这个函数的参数绑定

//线程类的构造函数    是一个变参模板函数
template< class Function, class... Args > 
explicit thread( Function&& f, Args&&... args );
#include<iostream>
#include<algorithm>
#include<thread>
using namespace std;

void func(int x) {
   
    for (int i = 0; i <x; i++) cout << i << endl;
    return ;
}

void add_one(int &x) {
   
    x += 1;
    return ;
}

int main() {
   
    int n = 8;
    //thread t1(func, 123), t2(func, 30);
    thread t1(add_one, ref(n)); //在线程里面传引用的话得加ref
    t1.join();
    cout << n << endl;
    cout << "helloc" << endl;
    return 0;
}

仿造线程的构造自己模拟

void add_one(int &x) {
   
    x += 1;
    return ;
}

class Task {
   
public:
    template<typename FUNCTION, typename ...ARGS>
    Task(FUNCTION &&f, ARGS ...args) {
   
        cout << "Task " << endl;
        f(forward<ARGS>(args)...); // 准确的向前传递
    }
};

int main() {
   
    int n = 8;
    //thread t1(func, 123), t2(func, 30);
    thread t1(add_one, ref(n)); //在线程里面传引用的话得加ref
    t1.join();

    Task t2(add_one, ref(n)); //这里把ref去掉也不会报错? 存在右值变左值
    cout << n << endl;
    cout << "helloc" << endl;
    return 0;
}

bind

将函数和参数进行打包生成新的函数 , 用于实现线程池.

bind绑定 function<> 定义返回值类型

class Task {
   
public:
    template<typename FUNCTION, typename ...ARGS>
    Task(FUNCTI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值