2017-01-05 10 views
15
#include <thread> 
#include <string> 
#include <vector> 
#include <chrono> 

using namespace std; 

void f(const vector<string>& coll) 
{ 
    this_thread::sleep_for(1h); 

    // 
    // Is coll guaranteed to be valid before exiting this function? 
    // 
} 

int main() 
{ 
    { 
     vector<string> coll(1024 * 1024 * 100); 
     thread(f, coll).detach(); 
    } 

    // 
    // I know std::thread will copy arguments into itself by default, 
    // but I don't know whether these copied objects are still valid 
    // after the std::thread object has been destroyed. 
    // 

    while (true); 
} 

참조로 인수를 std :: thread 함수로 전달하는 것이 안전합니까?참조로 인수를 std :: thread 함수로 전달하는 것이 안전합니까?

+1

짧은 대답 : 예, 완전히 안전하고 괜찮습니다. – DeiDei

+5

스레드에 대한 참조로 아무 것도 전달하지 않습니다. –

+0

죄송합니다. 당신 말이 맞습니다. 나는 코드를 잘못 읽었다. – Rafael

답변

3
  • coll이 기능을 종료하기 전에 유효 보장되어 있습니까?

    • 업데이트 : 예. collmain 함수의 스레드 생성자에 전달하면 coll이 개체이기 때문에 decay이 복사됩니다. 이 decay 사본은 본질적으로 move입니다. 따라서 벡터 실행시 fcoll 매개 변수에 바인드됩니다 (따라서 rvalue가됩니다). (@Praetorian의 코멘트 주셔서 감사합니다)
  • std :: thread 함수로 참조로 인수를 전달하는 것이 안전합니까?

    • 귀하의 주장은 decay입니다. 따라서 실제로는 std::thread을 참조하여 아무 것도 전달하지 않습니다. std::decay에 대한
  • 참조 : http://www.cplusplus.com/reference/type_traits/decay/

  • 이 질문에 std::thread with movable, non-copyable argument의 허용 대답은 @ TC의 주석으로 std::thread
+2

"붕괴 된"복사가 의미하는 것을 정교 할 수 있습니까? 참조로 전달되지 않은 경우 사본은 언제/어디에서 작성됩니까? 복사에 대한 참조는 OP의 예에서 'f'로 전달되어야합니다. 또한 람다 (lambdas)가 여전히 이러한 쇠약해진 행동에 뛰어 들어 가지 않고 참조로 포착 할 수있게한다는 점은 주목할 가치가 있습니다. – jtbandes

2

에 전달되는 인수에 무슨 설명, 당신이 통과하지 않는 스레드에 대한 참조를 사용하면 스레드의 벡터 복사본을 만듭니다.

thread(f, coll).detach(); // It's NOT pass by reference, but makes a copy. 
당신이 정말로 참조로 전달하려면

, 당신이 작성해야 :

thread(f, std::ref(coll)).detach(); // Use std::ref to pass by reference 

그런 다음 코드 세그먼트 오류를 ​​얻을 것이다 스레드가 스레드 실행, 그것은 매우 가능성이 벡터이 때부터, 벡터에 액세스하려고하면 파괴되었다.

질문에 대한 그래서 :

그것은 표준 : : 스레드 함수에 참조로 인수를 전달하는 안전한가요?

  • 당신이 객체가 스레드의 실행 동안 유효 확실 경우 안전;
  • 개체가 파괴 되어도 안전하지 않으므로 세그먼트 오류가 발생합니다.
+0

신규 이민자에게 명확한 답변. 감사! – alanwsx