2011-02-28 4 views
3

가정하자 I가 (K < < N)의 각 일부를 삽입하려는 어떠한 중복 함유하지 N 정수 및 K 스레드 정렬 단독 링크드리스트 정수 (헤드 노드보다 큼)를 목록에 추가합니다. 단독 링크드리스트 삽입 동기

것이 가능 그러한리스트로 삽입을 동기화되도록 :

  • 스레드 만의 (즉시) 이전 노드에 대한 액세스를 차단할 수
  • (이하 "전리스트"잠금 없음) 가장 O (K) 뮤텍스와 조건 변수 없음 선점/인터럽트

발생할 수 없다

  • 사용될 수있다?

  • +1

    숙제? 면접 질문? 너 자신에게이 질문에 답하려고 무엇을 했니? 그리고 이것이 C와 어떤 관련이 있습니까? –

    +0

    개인 프로젝트에서 일하고 있는데 현재 직면하고있는 문제 (더 복잡한 문제)는 내가 위에 묻는 것으로 줄어 듭니다. C에서 pthreads를 사용하여 솔루션을 구현하려고합니다. 그래서 C 태그를 추가했습니다. 구현 세부 사항을 좀 더 제공해야합니까? – ManRow

    답변

    3

    첫 번째로 컬렉션에 삽입하는 것이 매우 드문 경우지만 링크 된 목록은 큰 해결책이 아닙니다. 삽입 지점을 찾는 것이 정렬 된 목록에서도 O(N) 작업이기 때문에 나쁘게 스케일링을 끝내기. cur

  • 새 노드를 작성,

    1. 찾기 삽입 지점 :

      당신은 아직도 그것을 할 필요가 있다면, 그것은 몇 가지주의, 잠금없는 작업으로 정렬 된 목록으로 (삭제 달리) 삽입을 수행하는 것이 가능

    2. 원자 연산 (cur/cur->next에 이전/다음 링크를 할당) : compare_and_swap(cur->next, new, new->next);
      실패 할 경우 그렇지 if (new->value == next->value) return; // someone beat us to it
      : cur = cur->next 그리고 춤을 반복한다 (목록은 정렬된다. 우리 앞에 삽입 된 누군가)

    즉. 새 노드를 연결하려는 시도의 결과는 우리가 성공했거나 누군가가 같은 노드를 삽입하는 것입니다 (이 경우 이미 이미 존재합니다). 또는 누군가가 갭에 삽입되었습니다. N, N+3, N+1을 시도한 사람, 다른 사람이 성공한 사람 N+2) 성공할 때까지 또는 다른 사람이 수행 한 '우리'노드를 찾으면 다시 시도합니다.

    삭제를 동기화하는 것이 훨씬 어렵습니다. 그것을위한 RCU (Read-Copy-Update)를 찾는다.

  • +0

    삽입 포인터를 찾지 않아서 본질적으로 독자 - 작성자 문제가 발생할 수 있습니까? 즉, 목록을 수정중인 경우 삽입 지점을 검색하거나 찾을 수 없습니다. – ManRow

    +0

    "이전보다"테스트 중이며 삽입하여 해당 포인트가 변경되지 않습니다 (주의 : 삭제가 포함되므로 _modification_을 말하지는 않습니다). "원자 춤 (atomic dance)"내에서 다른 삽입 기가 너를 경쟁 시켰을 때 삽입 지점을 고쳐야 할 수도 있겠지만, 뒤로 물러 설 필요는 없다. –

    +0

    @ 프랑크.왜 compareAndSwap에 대한 세 가지 인수가 있는지 알지 못했습니다. Java에서는 (oldObject, newObject), 여기서 세 번째 인수는 무엇입니까? –