Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以使用对象及其非空参数列表调用操作符生成std::thread?_C++_Multithreading_C++11_Stdthread_Function Call Operator - Fatal编程技术网

C++ 有没有一种方法可以使用对象及其非空参数列表调用操作符生成std::thread?

C++ 有没有一种方法可以使用对象及其非空参数列表调用操作符生成std::thread?,c++,multithreading,c++11,stdthread,function-call-operator,C++,Multithreading,C++11,Stdthread,Function Call Operator,我对std::thread和C++11一般来说都是新手。尝试玩弄中的示例,我尝试查看是否可以使用带有非空参数列表的类成员函数调用运算符生成std::thread,如下代码所示: // main.cpp #include <iostream> #include <iostream> #include <thread> class Foo { public: void operator()( int& i ) { std::cout &l

我对std::thread和C++11一般来说都是新手。尝试玩弄中的示例,我尝试查看是否可以使用带有非空参数列表的类成员函数调用运算符生成
std::thread
,如下代码所示:

// main.cpp

#include <iostream>
#include <iostream>
#include <thread>

class Foo {
public:

  void operator()( int& i ) {
    std::cout << i << std::endl;
  }
};

int main( int argc, char* argv[] ) {
  Foo f;
  int i = 42;

  std::thread t1( f, i );
  t1.join();

  return 0;
}
我的第一次尝试是否可行?我只是有语法错误吗?有没有办法使用对象及其非空参数列表调用运算符生成std::thread?



我相信这个问题与其他问题不同,因为这个问题是专门关于使用成员对象调用操作符生成线程的。我知道这可以通过lambdas来完成。

std::thread
不允许通过引用传递,除非你是显式的,因为它很容易导致生命周期问题。使用
std::ref
明确表示您通过引用传递
i

std::thread t1( f, std::ref(i) );

或者,按值传递。在通过引用将某些内容传递给线程之前,请仔细考虑,并确保它是必要的。您传递的变量必须超过其在线程中的使用寿命。

使用lambda表达式。这是否回答了您的问题?具体来说,第二个答案。忽略第一个答案。@Passenger-我确实在cppreference.com上看到了使用成员函数的类似示例-但我想知道这是否可以通过呼叫接线员实现-因此我认为这个问题与您提供的链接不同。我已经撤回了我的重复投票,因为我觉得它是不同的;不过,在你的问题中值得一提的是,你知道可以用lambda来完成,但你特别要求在没有工作的情况下这样做——很好!但为什么要对通过引用传递进行特殊保护(我理解变量生存期问题),而通过指针传递似乎不是这样?例如,为了解决我的问题,我改为通过指针传递参数,而不是通过
std::ref
,这很有效。@StoneThrow,通过指针传递已经很明确了您在调用站点上有
&
来获取地址。如果你已经有了一个指针变量,你可以不加修饰地传递它,希望它的名字是好的。除此之外,没有现成的
std::reference\u wrapper
用于指针。
// main.cpp

#include <iostream>
#include <iostream>
#include <thread>

class Foo {
public:

  void operator()() {
    std::cout << 42 << std::endl;
  }
};

int main( int argc, char* argv[] ) {
  Foo f;
  int i = 42;

  std::thread t1( f );
  t1.join();

  return 0;
}
$ g++ --version && g++ ./main.cpp -lpthread && ./a.out
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

42
std::thread t1( f, std::ref(i) );