std :: thread和rvalue引用

时间:2015-09-27 14:52:46

标签: c++ multithreading c++11 rvalue-reference

我想要某种代理类。我的方法的缩短版本在下面,它的主要功能是启动新线程做一些事情(在这个例子中它每秒打印文本):

void Flusher::start(){
    m_continue.store(true);

    m_thread = std::thread([](std::atomic<bool>& shouldContinue){
        while(shouldContinue.load()){
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::cout << "sec passed" << std::endl;
        }}, std::ref<std::atomic<bool>>(m_continue)
    );
}

我担心的是,std :: thread构造函数具有以下签名:

template< class Function, class... Args > 
explicit thread( Function&& f, Args&&... args );

因此它需要将右值引用作为第一个和第二个参数。如果是这样,那么在将shouldContinue传递给<{1}}构造函数后,我不应该使用std::thread,因为已移动

当然我想控制这个函数,因此我想在调用者线程中使用shouldContinue来停止被调用的函数。出于显而易见的原因,我不想让这个变量成为全局变量。

我认为,std::ref在那里有些神奇,但我仍然不确定它是如何工作的(在创建新线程的某些例子中我看到std::ref。)

我试图完全不关心这个事实,这是rvalue引用,后来我使用了shouldContinue而没有崩溃,但我担心这只是未定义的行为。任何人都可以告诉上面的代码是否正确,如果没有,如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

当&amp;&amp;和与模板一起使用。

检查一下这是一个非常好的解释:

http://eli.thegreenplace.net/2014/perfect-forwarding-and-universal-references-in-c/

template <class T>
void func(T&& t) {
}

“当&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp; amp;&amp; amp;&amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp;&amp; amp类型U的左值,T推导到U&amp ;.如果它是一个右值,则T推导到U:“

func(4);            // 4 is an rvalue: T deduced to int

double d = 3.14;
func(d);            // d is an lvalue; T deduced to double&

float f() {...}
func(f());          // f() is an rvalue; T deduced to float

int bar(int i) {
  func(i);          // i is an lvalue; T deduced to int&
}

此外,参考折叠规则是一个很好的阅读。