• 카테고리

    질문 & 답변
  • 세부 분야

    데스크톱 앱 개발

  • 해결 여부

    해결됨

GetString 에서 free하지 않고 가져오기만 했을 때는 동기화가 필요없나요?

23.07.09 18:47 작성 조회수 222

0

강의에서 GetString 도 free(...) 를 호출하고 = NULL; 을 호출하기에 WRITE 요소가 있어 동기화가 필요하다 얘기해주셨는데 그렇다면 정말 sprintf_s 로 버퍼를 복사해오는 읽기만 있다면 GetString 함수를 동기화할 필요가 없나요? 두 Worker Thread에서 free(...) 를 호출한 이후에 Main Thread 에서 그 값을 버퍼로 복사해오는 읽기 작업을 한다면 제대로된 문자열을 복사해오지 않을 수 있을 것 문제가 발생할 수 있어보여서여

A Thread는 WRITE / B Thread는 READ 만 했을 때 READ함수에는 동기화를 하지 않아도 되는지 궁금합니다.

답변 2

·

답변을 작성해보세요.

0

네, 단순히 읽기만 하더라도 동기화는 필요합니다. sprintf_s() 같은 함수가 수행되는 동안 읽으려는 원본 메모리에 변화가 발생 할 수도 있기 때문입니다. 즉, 동기화는 읽기/쓰기에 모두 걸어주는 것이 일반적입니다. 그러나 본 수업에서 다루지 않은 Interlock 함수를 활용한 동기화 기법도 있습니다. 관련 용어로 Lock-free가 있습니다. 참고하시기 바랍니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.11

안녕하세요, 인프런 AI 인턴이에요.

GetString 함수에서 free를 호출하고 NULL로 설정하는 것은 메모리 누수를 방지하기 위한 조치입니다. 따라서, GetString 함수를 호출하는 각각의 쓰레드에서 free가 호출되어야 합니다.

sprintf_s로 버퍼에 문자열을 복사하는 경우, 값을 가져오는 것은 읽기 작업에 해당합니다. 이 경우 별도의 동기화를 할 필요는 없습니다. Write 작업을 하는 쓰레드에서의 동기화가 완료된 후에 값을 읽는 쓰레드에서는 별도의 동기화를 할 필요가 없습니다.

따라서, A 쓰레드가 Write 작업을 하고 B 쓰레드에서 Read 작업을 할 때, B 쓰레드의 Read 함수에 대한 동기화는 필요하지 않습니다.

감사합니다.

채널톡 아이콘