1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | while(true){ auto conn = server.accept(); room.push_back(conn); std::thread([&room](Sock& conn){ while(true){ auto data = conn.recv(); if(conn.state() == Sock::STATE::ERR) break; std::stringstream print; print << conn.ipv4() << ":" << conn.port() << " " << data; std::cout << print.str() << std::endl; for(auto& guest : room){ if(guest == conn) continue; guest.send(print.str()); } } room.erase( std::remove(room.begin(), room.end(), conn), room.end()); conn.close(); }, conn).detach();; | cs |
여기 보면 std::thread 호출 할 때 conn의 레퍼런스 넘겨주는데
바깥에 while 루프 한번 돌면 conn이 덮어씌어져서 thread 안에 있는 conn에서 에러나야 정상아님??
왜 잘 작동하는거죠?;;
돌때마다 새 conn이 생기니까요
이름은 같은데 별개의 변수임
이해가 안되네요. 제가 레퍼런스에 대한 이해가 부족한겁니까... 그럼 이전에 conn은 어디로 갔길레 레퍼런스가 가능한거죠?
참고로 Sock클래스느 winsock 래핑한거고 전혀 안전하지 않으며 내부적으로 동적할당같은것도 안함
루프안에 있는 변수선언은 그 루프가 끝나면 이름의 의미가 없잖아요
사실상 익명의 conn이 계속 쌓이고 있는셈
루프 돌면 이전 루프에서 선언된 변수는 사라지는거 아닙니까?
스택에 계속 쌓여요?
쓰레드 생성자에 복사본이 생기고 그게 살아있어요
맙소사
콜백이 conn의 레퍼런스를받긴하는데 쓰레드 생성자 조차도콜바이 벨류라
바로 이해됐다
감사합니다 ㅠ_ㅠ
코드 깔끔하다 멋지다.