美文网首页
2.2向线程函数传递参数

2.2向线程函数传递参数

作者: 常春藤上的蜗牛 | 来源:发表于2017-09-11 09:11 被阅读0次

如何传递参数?

void f(int i, std::string const& s);
std::thread t(f, 3, "hello");

【注意】 默认参数是拷贝到线程独立内存中的,以便新线程在执行中可以访问,即使参数是引用的形式。

特别注意,当指向动态变量的指针作为参数传递给线程的情况

void f(int i,std::string const& s);
void oops(int some_param)
{
  char buffer[1024]; // 1
  sprintf(buffer, "%i",some_param);
  std::thread t(f,3,std::string(buffer)); // 使用std::string,避免悬念
  t.detach();
}

成功的传递一个引用,会发生在线程更新数据结构时。

void update_data_for_widget(widget_id w,widget_data& data); // 1
void oops_again(widget_id w)
{
  widget_data data;
  std::thread t(update_data_for_widget,w,data); // 2
  display_status();
  t.join();
  process_widget_data(data); // 3
}

update_data_for_widget的第二个参数期待传入一个引用,但是std::thread的构造函数,不知道这件事,构造函数无视函数期待的参数类型,并且盲目拷贝已提供的变量。当线程调用update_data_for_widget函数时,传递给函数的参数是data变量内部拷贝的引用,而非数据本身的引用。当线程结束时, 内部拷贝数据将会在数据更新阶段被销毁,且process_widget_data将会接收到没有修改的data变量。
解决这个问题:使用std::ref将参数转换成引用的形式:

std::thread t(update_data_for_widget, w, std::ref(data));

可以传递一个成员函数指针作为线程函数, 并提供一个合适的对象指针作为第一个参数:

class X
{ 
public:
    void do_lengthy_work();
};
X my_x;
std::thread t(&X::do_lengthy_work,&my_x); 

也可以为成员函数提供参数:std::thread构造函数的第三个参数就是成员函数的第一个参数:

class X
{ 
public:
    void do_lengthy_work(int);
};
X my_x;
int num(0);
std::thread t(&X::do_lengthy_work, &my_x, num);

一个有趣的地方是:
提供的参数可以是“移动的”,但不能是“拷贝”。这里的移动是指原始对象中的数据转移给另一对象, 而转移的这些数据就不再在原始对象中保存了。
下面的代码展示了std::move的用法,它是如何转移一个动态对象到一个线程中去的:

void process_big_object(std::unique_ptr<big_object>);
std::unique_ptr<big_object> p(new big_object);
p->prepare_data(42);
std::thread t(process_big_object,std::move(p));

相关文章

  • 2.2向线程函数传递参数

    如何传递参数? 【注意】 默认参数是拷贝到线程独立内存中的,以便新线程在执行中可以访问,即使参数是引用的形式。 特...

  • Python 向对象传入任意数量的实参

    向函数传递任意参数 我们都知道,Python 可以通过 *params 向函数传递任意多个参数。举个栗子: 得到的...

  • C++向线程函数传递参数

    C++11的多线程,传递参数时,有几个细节需要注意,如果没有处理好,有可能会得不到预期结果,甚至发生崩溃。 值类型...

  • 第6章:函数

    #1.函数基础1.1 局部对象1.2 函数声明1.3 分离式编译 #2.参数传递2.1 传值参数2.2 传引用参数...

  • C++ 并发编程学习(三)

    向线程函数传递参数 一. 传参const char*   函数f需要一个 std::string 对象作为第二个参...

  • 2.2 向线程函数传递参数 ~ 2.3转移线程所有权

    一、依赖隐式转换的危险 在 std::thread t 的构造函数中,想要依赖隐式转换,将字面值buffer转换为...

  • C++11线程函数的参数传递

    线程函数的参数传递过程 参数从调用线程创建一份拷贝 执行线程的拷贝变量拷贝到函数实参 验证: 可以看出A对象的拷贝...

  • ndk开发-6 子线程操作

    创建线程 向子线程传递参数 获取线程的返回值 输出结果 线程同步的问题

  • python基础(下)

    一、多线程 向线程的目标函数中传递参数 从python中启动其他的程序 二、类的简单使用 1.基础类 2.父类、子...

  • C++使用Lambda函数实现多线程

    转帖: C++使用Lambda函数实现多线程thread - 传递引用参数

网友评论

      本文标题:2.2向线程函数传递参数

      本文链接:https://www.haomeiwen.com/subject/ikexsxtx.html