c++11 线程函数参数的传递-引用和指针

本文探讨了C++11中如何使用std::thread正确传递参数,包括std::ref处理引用类型和直接传递指针。通过实例展示了std::ref的使用以及不同情况下参数复制行为。

        c++11线程类里,传递参数给可调用对象或函数,基本上就是简单地将额外的参数传递给 std::thread 构造函数。但重要的是,参数会以默认的方式被复制到内部存储空间,在那里新线程可以访问它们,即使函数中的相应参数期待着引用。如:

#include <stdio.h>
#include <stdlib.h>
#include <thread>
#include <string>
#include <sys/syscall.h>
#include <unistd.h>


void funcProc(int &value)
{
    printf("in new thread %lu, old value = %d\n", syscall(SYS_gettid), value);
    value = 250;
}

void funcProc1(int *value)
{
    printf("in new thread %lu, old value = %d\n", syscall(SYS_gettid), *value);
    *value = 350;
}

void funcProc2(char *str, int size)
{
    printf("in new thread %lu, old str = %d\n", syscall(SYS_gettid), *str);
    snprintf(str, size, "%s", "just a test");
}

int main()
{
    int value = 100;
    std::thread task(funcProc, std::ref(value));
    task.join();
    printf("value = %d\n", value);

    std::thread task1(funcProc1, &value);
    task1.join();
    printf("value = %d\n", value);

    char str[24] = "init";
    std::thread task2(funcProc2, str, 24);
    task2.join();
    printf("str = %s\n", str);    
    return 0;
}

要实现函数所期待的引用,则需要用到 std::ref(),而传递指针,我们可以正常传递,其运行结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值