나는 람다에 루프 변수 매개 변수가있는 for 루프 안에 람다를 가지고 있습니다. 내가 그것을 실행할 때, 나는 숫자 0-9가 출력되기를 기대한다. 그러나 람다이므로 x는 즉시 평가되지 않습니다.루프 내 람다
for(int x = 0; x < n; ++x)
{
vec.push_back(thread{[&x](){
m.lock();
cout << x << endl;
m.unlock();
}});
}
출력 :
0
3
3
9
등
다른 언어에 대한 해결책은 임시 변수를 생성하는 것,
for(int x = 0; x < n; ++x)
{
int tmp = x;
vec.push_back(thread{[&tmp](){
m.lock();
cout << tmp << endl;
m.unlock();
}});
}
하지만이 작동하지 않는 것 . 답변에 대한 내 검색에서
, 나는 반복자를 무효화 할 용기를 사용하지 않는 것이 좋습니다이 질문에 Generalizing C++11 Threads class to work with lambda 우연히 :
는 Threads receiving wrong parameters
이 보너스를 참조하십시오.
vec.push_back(std::thread{[x](){
m.lock();
std::cout << x << std::endl;
m.unlock();
}});
이 람다 객체가 생성 된 시점에 x
의 값을 복사합니다 : 당신이 복사본을 만들려면 왜 것이라고 값에 의해 대신 참조/
나는 바보 같은 기분이 든다. 나는 람다 표현에서 &가 무엇을했는지 오해했다. 이 단순화 된 예에서 그렇습니다. lock_guard가 적절할 것입니다. 그러나 실제 응용 프로그램에서 함수는 잠글 필요가없는 많은 작업을 수행합니다. 이 경우 뮤텍스는 중요한 부분 주위에서만 적절한 잠금 및 잠금 해제가 될 것입니다. – SaulBack
@SaulBack : 아니요. 어느쪽으로 든'lock_guard'를 사용해야합니다. 특정 코드 만 잠그고 싶다면'{} '와 함께 명시 적 블록을 사용하여 잠긴 코드를 묶으십시오. 이것은 기본 RAII 코딩입니다. –
@SaulBack : 특히 복잡한 코드에서 RAII를 사용하려고합니다. 예 :'std :: lock_guard'! 이 ** 사소한 ** 예제에서 나는 그것이 필요하지 않다는 것을 알 수 있지만, 조금 더 복잡한 것은 빨리 벗어나게됩니다. 잠금이 유지되는 범위를 제한해야하는 경우 범위 (즉, {{<잠금 및 코드가 필요합니다>}')를 사용하십시오. –