2017-02-26 1 views
1

방금 ​​C에서 LinkedList를 만들었고 clear 함수가 있습니다.C - 스레드에서 데이터 구조 해제?

clear 함수는 LinkedList를 통해 반복하고 각 노드에서 free()을 호출합니다. 이것은 그것이 느린 O(n) 함수라는 것을 의미합니다.

내가 대신 pthread (I 약을 모르거나 다른 스레드 라이브러리)를 만들 경우, 그것을 내 root 노드를 제공 NULL 내 LinkedList의의 root 노드를 설정 한 다음 스레드가 목록 동안 메모리를 정리해야 이제 즉시 추가 할 준비가 되셨습니까? 이 일에 위험이 있습니까? 필자는 필 요할 공간이 충분하기 전에 사용자가 LinkedList에 더 많은 데이터를 추가 할 수 있다는 의미일까요? 그것은 신용 카드와 같지만 기억을위한 것입니다.

안전한가요? 이런 유형의 상황에 대해 강력하고 신속한 코드를 만들려면 무엇이 필요할까요?

+0

"... 매우 느립니다." - 뭐라구? 물론, 생각하는 것처럼 메모리 누수가 더 빠를 수도 있습니다. 그 말 : 당신이 무엇을 요구하는지 분명하지 않습니다. 필요한 모든 정보를 [mcve]에게 제공하십시오. – Olaf

+0

링크 된 목록은 일반적으로 성능이 좋지 않으며 할당 해제로 인해 수행되지 않습니다. 벤치 마크가 없으면 참조 시스템과 성능 요구 사항이 답할 수 없습니다. – nwp

+0

제 의견으로는 이것이 전체 연결된 목록을 지우는 유일한 방법입니다. "내 LinkedList의 루트 노드를 NULL로 설정 한 다음 스레드가 메모리를 정리하도록하십시오"만약 당신이'루트'노드를 잃어버린다면 어떻게 다른 노드에 접근 할 수 있습니까? – Mouin

답변

1

물론, pthread로 컴파일하는 경우 free는 스레드 안전해야합니다.

안전한가요? 뮤텍스를 사용하여 액세스가 동시 편집으로부터 보호되는지 확인하십시오.

해야할까요? 일반적인 컨테이너 구조 뒤에 스레드를 숨기는 것은 잘못된 아키텍처 스타일로 간주됩니다. 라이브러리 사용자는 작업을 완료하는 차단 방법을 clear()로 간주합니다. 라이브러리 사용자가 비동기 자유를 필요로하는 경우, 독자적으로 스레드를 포크 할 수 있습니다.

연결 목록을 지우려면 O (n) 시간 복잡성이 있어야합니까? 모든 메모리가 관리되는 연속 블록에있는 경우에는 그렇지 않습니다.

+0

나는 당신의 글을 쓰기 전에 답을 쓰려고하고있었습니다. 스레드를 생성하고, 잠금을 기다리는 등 오버 헤드가 발생하기 때문에 속도는 향상되지 않을 것이라고 덧붙이 겠지만 스레드가 2 개 이상이라도 단일 실행 단위로 끝납니다. –

+0

질문은 더 많은 데이터 구조의 메모리를 지우는 쓰레드를 사용해야 만합니다. 아니면 그냥 쓰레드를 사용하고 메인 쓰레드의 O (n)에서 지워야 만합니까? – Hatefiend

-1

많은 스레드에 clear 작업을 배포하는 것은 좋은 생각이 아닙니다.

문제는 clear 함수가 반환되지 않기 때문에 긴 목록 (긴 시간이 필요)에 대해 clear을 호출하고 차단되는 주 스레드가 있다고 가정합니다. 이 경우 메인 스레드와 clear 명령을 받고 메모리를 해제 할 때까지 기다리는 다른 스레드 "가비지 수집기"를 사용하는 것이 좋습니다.

2 개의 스레드를 사용하면 발신자를 차단하지 않아도됩니다. 질문에 대한 답변을

+0

음 잠깐 나는 조금 혼란 스러울지도 모른다. 주 스레드가 클리어 스레드를 완료 할 때까지 기다리는 이유는 무엇입니까? 주 스레드가 정리 스레드를 시작하지 않아야하며 그 스레드에 대해 계속 진행해야합니까? – Hatefiend

+0

@Hatefiend,'clear' 함수는 연결된리스트 노드에 대해 free를 호출하는 while 루프이므로'clear'를 호출하면 호출자가 차단됩니다. – Mouin

+0

예,하지만 여기에 아이디어가 있습니다 : '루트'노드에 대한 참조를 정리 스레드에 전달합니다. 그것은'Node'를 사용하여 이동하고 지 웁니다. 한편 메인 스레드로 되돌아 가면,'LinkedList'' 구조체'의'root' 속성을'NULL'으로 설정합니다. 마치 목록의 오래된 항목이 영원히 사라진 것처럼 말입니다. 리스트의'size'를'0'으로 설정하고 주 스레드의'O (1)'속도와 정리 스레드의'O (n)'속도로 전체 목록을 지운 것과 같습니다. 기다리지 않아도 되니? 내가 틀렸다면? – Hatefiend