가정하자 I가 (K < < N)의 각 일부를 삽입하려는 어떠한 중복 함유하지 N 정수 및 K 스레드 정렬 단독 링크드리스트 정수 (헤드 노드보다 큼)를 목록에 추가합니다. 단독 링크드리스트 삽입 동기
것이 가능 그러한리스트로 삽입을 동기화되도록 : 는- 스레드 만의 (즉시) 이전 노드에 대한 액세스를 차단할 수
- (이하 "전리스트"잠금 없음) 가장 O (K) 뮤텍스와 조건 변수 없음 선점/인터럽트
발생할 수 없다
가정하자 I가 (K < < N)의 각 일부를 삽입하려는 어떠한 중복 함유하지 N 정수 및 K 스레드 정렬 단독 링크드리스트 정수 (헤드 노드보다 큼)를 목록에 추가합니다. 단독 링크드리스트 삽입 동기
것이 가능 그러한리스트로 삽입을 동기화되도록 : 는발생할 수 없다
첫 번째로 컬렉션에 삽입하는 것이 매우 드문 경우지만 링크 된 목록은 큰 해결책이 아닙니다. 삽입 지점을 찾는 것이 정렬 된 목록에서도 O(N)
작업이기 때문에 나쁘게 스케일링을 끝내기. cur
당신은 아직도 그것을 할 필요가 있다면, 그것은 몇 가지주의, 잠금없는 작업으로 정렬 된 목록으로 (삭제 달리) 삽입을 수행하는 것이 가능
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)를 찾는다.
삽입 포인터를 찾지 않아서 본질적으로 독자 - 작성자 문제가 발생할 수 있습니까? 즉, 목록을 수정중인 경우 삽입 지점을 검색하거나 찾을 수 없습니다. – ManRow
"이전보다"테스트 중이며 삽입하여 해당 포인트가 변경되지 않습니다 (주의 : 삭제가 포함되므로 _modification_을 말하지는 않습니다). "원자 춤 (atomic dance)"내에서 다른 삽입 기가 너를 경쟁 시켰을 때 삽입 지점을 고쳐야 할 수도 있겠지만, 뒤로 물러 설 필요는 없다. –
@ 프랑크.왜 compareAndSwap에 대한 세 가지 인수가 있는지 알지 못했습니다. Java에서는 (oldObject, newObject), 여기서 세 번째 인수는 무엇입니까? –
숙제? 면접 질문? 너 자신에게이 질문에 답하려고 무엇을 했니? 그리고 이것이 C와 어떤 관련이 있습니까? –
개인 프로젝트에서 일하고 있는데 현재 직면하고있는 문제 (더 복잡한 문제)는 내가 위에 묻는 것으로 줄어 듭니다. C에서 pthreads를 사용하여 솔루션을 구현하려고합니다. 그래서 C 태그를 추가했습니다. 구현 세부 사항을 좀 더 제공해야합니까? – ManRow