2016-12-06 3 views
0

웹 서비스를 청취하는 작업에 참여했습니다. 푸시 서비스를 통해 xml 데이터를 전송합니다. 데이터는 약간의 계산을 거친 후 표시됩니다.잠금 대기열 대 잠금 해제 대기열

대기열을 사용하여 서비스 수신기에서 데이터를 저장하고 비즈니스 로직 코드로 데이터를 읽을 계획입니다. 순수한 단일 생산자 단일 고객 대기열입니다.

웹 서비스 푸시로 데이터를 수신해야하므로 항상 데이터를 받고 대기열로 밀어 넣어야합니다. 나는 boost_lockfree_spsc_queue을 사용하는 것을 생각했다. 잠금 대기열 인 경우 청취자는 잠금을 획득하는 데 잠시 기다려야하므로 반대로 boost_lockfree_spsc_queue에는 잠금이 필요하지 않습니다.

내가 저장하기 위하여려고하고 데이터는

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 

되고 큐는 내가 조금 혼란 가지고

boost::lockfree::spsc_queue<MemoryStruct*> lockFreeQ{100}; 

여기 읽기 성능 섹션 후입니다.

프로덕션 목적으로이 boost_lockfree_spcc_queue를 사용하는 것이 안전합니까? 또는 표준 대기열 (C++ 11)을 잠금과 함께 사용해야합니까?

감사합니다.

+1

예 생산 요구 사항을 준수하는 한 사용 요구 사항을 준수하는 것이 안전합니다. 어떤 부분을 혼란스럽게 만들었습니까? – sehe

+0

당신은'MemoryStruct'를 사용하지만'boost'가 프로그램을 망칠 까봐 걱정됩니까? – nwp

+0

MemoryStruct 사용에 문제가 있습니까? – Kid

답변

2

예. 부하가 CPU를 포화시키지 않을 것으로 예상된다면 전기 요금이 갑자기 늘어날 것입니다. 일반적인 접근법은 지수 적 백 오프입니다. ¹

이 문제에 대해 전혀 확신하지 못하는 경우 조기 최적화와 비슷한 냄새가 나며 잠금 대기열을 사용할 수 있습니다.

사용 패턴에 따라 잠금이 필요없는 구현을 쉽게 교환 할 수 있습니다. 자물쇠가없는 구현의 경우 대기 논리를 래핑하는 함수 pop()을 직접 차단하십시오.

¹ 예 : http://kukuruku.co/hub/cpp/lock-free-data-structures-the-evolution-of-a-stack

+0

"귀하의 진술에 대해 아직 명확하지 않습니다."잠긴 경우 대기 논리를 래핑하는 고유 한 차단 pop() 함수를 만듭니다. -free 구현. " – Kid

+0

내 자신의 예약 만들기 pop()은 lock() 및 unlock()을 사용하여 서라운드 팝()을 의미합니다. 래핑 대기 로직은 잠금이없는 상태에서 무엇을 의미합니까? 잠금 무료 평균 대기 권리 무료? 그런데 왜 대기 논리를 사용하여 잠금없는 구현을 왜곡해야합니까? – Kid

+0

TL; DR은 잠금 대기열을 사용합니다. 선택 사항으로 잠금없는 대기열을 가지고 놀고 인터페이스에서 차이점을 볼 수 있습니다 (예 : 'size()'또는 'empty()'호출 없음). 이렇게하면 향후 버전에서 잠금이 필요없는 큐로 쉽게 마이그레이션 할 수 있습니다. 한 번에 한 단계 씩.당신이 이해하는 것을 보시고, 한 번에 한 발씩 지식을 넓히십시오 _ - 호기심을 따르십시오. 점프 만하면 경험/이해에 구멍이 생깁니다. – sehe