스레드 함수에 객체 참조 전달: 과제 이해
C의 std::thread 인터페이스에서 객체 참조 인수를 스레드에 전달 함수에서는 컴파일 오류가 발생할 수 있습니다. 이 문서에서는 이러한 오류의 근본 원인을 살펴보고 해결 방법을 제공합니다.
객체 참조 전달 이해
제공된 예에서 정수(k)는 스레드 함수는 다음과 같습니다.
void foo(int &i) { // Do something with i std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
그러나 ostream 참조를 스레드 함수에 전달하려고 하면 컴파일이 발생합니다. 오류:
void foo(std::ostream &os) { // Do something with os os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
삭제된 생성자
컴파일 오류의 원인은 std::thread에 직접 개체 참조 전달을 방지하는 삭제된 생성자가 있다는 사실입니다. 스레드가 경쟁 조건을 피하기 위해 인수를 복사해야 하므로 이는 의도적인 것입니다.
해결책: std::ref
객체 참조를 명시적으로 전달하려면 다음으로 래핑하세요. std::ref (또는 상수 참조의 경우 std::cref). 이 솔루션은 참조 복사본이 스레드 함수에 전달되어 안전성을 보장합니다.
std::thread t(foo, std::ref(std::cout));
객체 수명 보존
참조 래퍼에는 객체에 대한 참조만 포함됩니다. 따라서 스레드가 실행되는 동안 개체가 활성 상태로 유지되도록 하는 것이 중요합니다. 그렇지 않으면 정의되지 않은 동작이 발생합니다.
위 내용은 C 스레드에 개체 참조를 전달하면 컴파일 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!