하나의 linked list에 두 개 이상의 thread가 접근하게 되면...

indizarm의 이미지

1. 조건
class linked list; -> 삽입, 삭제 메서드를 가지고 있음
class a; ->linked list 삽입 또는 삭제 호출
class b; ->역시 linked list 삭제 또는 삽입 호출

2. 문제되리라 여겨지는 상황
class a와 b가 각각 linked list의 (삽입, 삭제) 또는 (삭제, 삽입)을 호출할 때
linked list에서 '삽입'이 되는 위치에 있는 노드와, '삭제'하려는 노드가 같은
경우.

물론 linked list의 '삽입', '삭제' 메서드는 내부에서 크리티컬 섹션 변수로 보호
하고 있으나, '삽입' 메서드의 호출이 '삭제' 메서드의 호출을 제한한다거나 그
반대의 경우를 취할 수 없으므로, 기준이 되는 노드에 동시에 '삽입', '삭제'가
호출된다면...

3. (원치는 않지만) 생각해본 해결 방안
아예 '삽입' 메서드와 '삭제' 메서드를 '삽입 & 삭제' 메서드로 바꾸어서
'삽입()', '삭제()'로 호출하던 것을 '삽입 & 삭제(, 선택 flag)'

4. 정리

[1] - [2] - [3] - [4] => 노드 [4]의 앞, 뒤에 '삽입'을 하고 동시에 노드 [4]
를 '삭제'할려고하면 문제가 발생하지 않는가?

문제가 발생한다면 어떻게 해야 처리를 할 수 있을까?


* 질문 하나 더

만약 메서드 안에서 if- else 문이 있을 때, if 절과 else 절을 하나로 묶지 않고
따로 (크리티컬 섹션등으로) 묶으면, 그 메서드를 동시에 호출하게 되었을 때
문제가 될 수 있을까?

문제가 된다면 메서드의 내부를 완전히 하나의 '덩어리'로 취급해서 크리티컬 섹션
으로 묶어야 할까? (그러면 상당히 버벅이게 될 것으로 생각되어서 조금 꺼려집니다만...)

좋은 의견 듣고 싶습니다.

sunyzero의 이미지

삽입과 삭제 둘다. 뮤텍스로 보호해주면 됩니다.

그냥 간단한 크리티컬 섹션 문제이며, 그다지 성능에 큰 영향을 미칠정도는 아니겠죠. 애초부터 그렇게 많은 삽입, 삭제가 발생한다면 single 로 가는것보다 multi queue 에 list 를 만들어 사용하는게 더 좋겠죠.

========================================
* The truth will set you free.

bugiii의 이미지

어떤 자료에 접근(읽기/쓰기)을 할 때 원자적으로 실행이 보장되어야 하는 것은 단순히 그 자료의 내부에서 뮤텍스(대표로 말할 수 있는)로 처리할 수 있는 문제입니다.

하지만, 그 접근이 외부에서 여러개가 일어나면서 한 묶음으로 처리되어야 하는 경우에는 어떠한 자료구조도 내부에서 그 일을 대신해 줄 수 없습니다. 그러므로, 외부에서 그러한 용도의 뮤텍스를 따로 가지고 접근하는 쓰레드들끼리 협동하는 것 밖에는 방법이 없습니다.

아마도 pthread나 그와 유사한 쓰레드를 사용하려고 하시나 봅니다. 제가 전에도 말씀드렸지만, 이런 문제들 때문에 GNU pth 같은 협동 쓰레드 모델의 쓰레드 라이브러리를 사용하시는 것이 더 나은 경우가 많습니다. 이런 기본적인 자료구조 접근에 지저분한 뮤텍스나 동기화 객체같은 것이 붙을 필요가 없거든요...

그럼, 이만...

p.s. 이제 그만 포기하시고 GNU pth 쓰시는게 어떠세요? :wink:

indizarm의 이미지

bugiii wrote:
p.s. 이제 그만 포기하시고 GNU pth 쓰시는게 어떠세요? :wink:

-_-; 헉! 지금 하는 것은 VC++로 WinAPI를 써서 작성하고 있습니다.
저번일을 아직까지 기억하시다니...

bugiii wrote:
하지만, 그 접근이 외부에서 여러개가 일어나면서 한 묶음으로 처리되어야 하는 경우에는 어떠한 자료구조도 내부에서 그 일을 대신해 줄 수 없습니다. 그러므로, 외부에서 그러한 용도의 뮤텍스를 따로 가지고 접근하는 쓰레드들끼리 협동하는 것 밖에는 방법이 없습니다.

음... 저도 그렇게 생각하고 있습니다. 단순히 크리티컬 섹션이나 뮤텍스같은
객체로 각각의 메서드 안에서 묶어주면 될 줄 알았는데, 외부에서 다른 thread
또는 객체가 동시에 '반대의 역할을 하는 메서드'를 호출하게 되면, 소용이 없을
것 같다는 생각이 문득 들어서 여쭤봤습니다.

역시 Pth와 같은 라이브러리를 사용하지 않으면, '삽질'을 하는 수 밖에 없을 듯
하군요. (현재 생각해둔 것, 현재 list의 상태를 나타내는 flag를 통해서 메서드
접근을 막는 것. 예를 들어서 status: 1 (삽입), 2 (삭제), 3 (etc) )

sunyzero wrote:
그다지 성능에 큰 영향을 미칠정도는 아니겠죠. 애초부터 그렇게 많은 삽입, 삭제가 발생한다면 single 로 가는것보다 multi queue 에 list 를 만들어 사용하는게 더 좋겠죠.

음... 지금 하려고 하는 것이 하나의 버퍼에 thread 1/ 객체 1은 데이터를 쓰고
thread 1/ 객체 2는 같은 버퍼를 읽으면서 비워나가는 것이기 때문에, 조금
힘들것 같습니다.

답변 감사드립니다. 즐거운 저녁 되세요. ^_^

What a Cool Days!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.