2017-10-11 63 views
1

我已經對新的C++ 11右值做了相當多的研究,並通過左值繼承。 這裏是什麼,我已經找到並閱讀樣本:std ::線程構造函數在使用類成員函數時通過引用傳遞

what-does-t-double-ampersand-mean-in-c11

how-stdthread-constructor-detects-rvalue-reference

stdthread-and-rvalue-reference

我也介紹了自己的右值引用

Move_Semantics

rvalue_references

A Proposal to Add an Rvalue Reference to the C++ Language

具體而言,關於std::thread構造,我發現

how-to-create-a-thread-inside-a-class-function

和所使用的ANSW之一ERS寫一些簡單的代碼

#pragma once 
#ifndef CONSUMER_H 
#define CONSUMER_H 

#include "Mailbox.h" 
#include <thread> 
#include <iostream> 

class Consumer 
{ 
private: 
    Mailbox mailbox; 
    std::thread consumer; 
public: 
    Consumer(Mailbox& newMailbox); 
    ~Consumer(); 
    void operator()() { std::cout << consumer.get_id() << "starting\n"; } 
    void start(); 
    void run(); 
}; 

Consumer::Consumer(Mailbox& newMailbox) 
{ 
    this->mailbox = newMailbox; 
} 

void Consumer::start() 
{ 
    consumer = std::thread(&Consumer::run, this); <-- need understanding 
} 

#endif 

檢查'的std :: thread構造函數的

std::thread::Thread

我觀察到,使用右值參數的模板。據我所知,std::thread可以通過一個簡單的例子

void run(void) {std::cout << "I'm running";} 

std::thread(run); 

,直到我是一個類的內部,由此,我需要做下面的

consumer = std::thread(&Consumer::run, this); <-- need understanding 

,因爲我從喬納森Wakely瞭解到這似乎直截了當啓動run()是一個非靜態成員函數,必須在一個對象上運行。如果你不告訴它,新線程應該如何知道哪個對象要調用它?

這是有道理的,但需要通過引用類函數沒有,因爲我看到A a; A&& ref = A()可能。我對rvalues超級困惑,只是想了解爲什麼我上面寫的代碼有必要將函數傳遞給std::thread

我覺得肯定我也不明白variadic模板,以及要麼使我瞭解std::thread可變模板構造函數的化合物。

+1

的符號在'消費=的std ::線程(消費者::運行,這一點);'無關做參考。這是一個地址 - 運算符,需要形成[指向成員函數](http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_member_functions) –

+0

@IgorTandetnik同樣的事情; 'int age = 45; int&rage = age是對age的引用,並且引用返回一個指針,但是下面的int age = 45; int * page = &age; int && sage = page;'不是真的,所以我仍然感到困惑。 – Mushy

+0

你是什麼意思「和一個引用返回一個指針」?這對我來說毫無意義,對不起。 'age'和'rage'都不是指針。而'int && sage = page;'不會編譯。 –

回答

2

我觀察一個使用右值參數的模板。

不,std::thread構造函數使用轉發引用,這意味着它們可以接受任何類型的參數並根據參數類型推斷左值或右值引用。

閱讀forwarding referencesUniversal References in C++11(Scott Meyers爲這些名字引入了「universal reference」,但官方名稱現在是「forwarding reference」)。

這有一定的道理,但需要通過引用傳遞類功能不

你困惑,&Consumer::run沒有任何類型的參考。作爲類型名稱的一部分的符號&意味着引用,但是當它在表達式的左邊變成它時,它是形成指針的「地址」操作符。在這種情況下,它正在形成pointer to member function

表達式std::thread(&Consumer::run, this)構造一個帶有兩個參數的線程,一個指向應該在新線程中運行的成員函數的指針,以及一個指向成員函數將被調用的對象的指針。因此,在新的線程,這樣的事情發生了:

auto pointer_to_member_function = &Consumer::run; 
auto pointer_to_object = this; 
(pointer_to_object->.pointer_to_member_function)(); 

這相當於跑步this->run()

相關問題