2011-12-15 2 views
3

스트랜드가 동시에 실행되지 않으므로 스트랜드와 단일 스레드 간의 성능 차이는 무엇입니까? 또한 잠금 기능은 게시물 기능의 처리기에서 공유 데이터를 보호하는 데 필요하지 않습니다. 맞습니까?부스트 스트랜드 대 싱글 스레드

응용 프로그램 성능이 여러 작업을 가정하면 아래에 몇 가지 샘플 코드가 있습니다.

strand.post(boost::bind(&onJob, this, job1)); 

void onJob(tJobType oType) 
{ 
    if (oType == job1) 
    // do something 
    else if(oType == job2) 
    // do something 
} 

편집 : 게시물의 대기 시간을 측정하려고 시도하고 onJob을 호출하면 상당히 높습니다. 그것을 줄일 수있는 방법이 있는지 알고 싶습니다.

+0

이 질문에 대한 문맥을 제공 할 수 있습니까? 이 가닥들을 왜 사용하고 있습니까? –

+0

Boost.Strand는 어디에서 찾을 수 있습니까? 또한 귀하의 질문은 정확히 무엇입니까? –

+0

@deft_code a strand (http://www.boost.org/doc/libs/release/doc/html/boost_asio/overview/core/strands.html)는 Boost.Asio 라이브러리가 제공하는 개념으로, 명시 적 잠금을 사용하지 않고 콜백을 호출하는 여러 스레드. –

답변

11

strand은 일반적으로 단일 스레드보다 성능이 좋습니다. 이는 스트랜드가 스케줄러와 프로그램 로직에 더 많은 유연성을 제공하기 때문입니다. 그러나 차이점은 일반적으로 중요하지 않습니다 (아래에서 논의하는 특별한 경우는 제외).

예를 들어 서비스가 필요한 무언가가 발생하는 경우를 생각해보십시오. 스트랜드를 사용하면 서비스를 수행 할 수있는 스레드가 두 개 이상있을 수 있으며, 먼저 예약 된 스레드 중 어느 것이 든 해당 작업을 수행하게됩니다. 스레드를 사용하면 작업을 시작하기 위해 스레드를 예약해야합니다.

예를 들어 타이머가 작동하여 가닥에 의해 수행 될 새로운 작업을 만듭니다. 그런 다음 타이머 스레드가 strand의 디스패치 루틴을 호출하면 타이머 스레드는 컨텍스트 전환없이 작업을 수행 할 수 있습니다. 가닥이 아닌 전용 스레드가있는 경우 타이머 스레드는 작업을 수행 할 수 없으며 타이머 루틴에 의해 작성된 작업이 시작되기 전에 컨텍스트 전환이 필요합니다.

스트랜드를 실행하는 스레드가 하나 뿐인 경우 이러한 이점을 얻지 못합니다. (하지만, IMO,이 수준의 성능을 중요하게 생각하면 일을하는 것이 바보 같은 방법입니다.)

일부 애플리케이션의 경우 프로그램을 신중하게 스트링으로 분할하면 필요한 잠금 작업량을 크게 줄일 수 있습니다. 한 가닥에서만 액세스되는 객체는 잠글 필요가 없습니다. 그러나 멀티 스레딩의 많은 이점을 얻을 수 있습니다. (단 하나의 큰 단점 - 비록 코드 블럭이라면 전체 스트링을 멈추게 할 것입니다. 그래서 스트랜드가 멈추거나 중요한 스트랜드에 대한 코드가 블록되지 않았는지 염려하지 않아도됩니다.)

이 경우 A, B 및 C 세 가닥이 가능하며 단일 스레드는 A 전환, B 전환, C 전환이 가능합니다. 캐시에서 뜨거운 데이터). 각 작업에 스레드를 사용하려면 동일한 작업을 수행하는 두 개의 컨텍스트 전환이 필요하며 각 작업은 캐시의 데이터를 찾지 못할 가능성이 높습니다. 끊임없이 물체를 물가에서 물가로 옮기면 가닥이 전용 나사보다 월등히 뛰어납니다.

두 번째 질문에 대해서는 데이터가 한 스레드에서 액세스되는 동안 다른 스레드에서 수정 될 수있는 경우가 아니면 잠금이 필요하지 않습니다. 오브젝트에 대한 모든 액세스가 단일 스트랜드를 통해 이루어지는 경우, 스트랜드는 한 번에 하나의 스레드에서만 실행될 수 있기 때문에 잠금이 필요하지 않습니다. 일반적으로 스트랜드는 해당 가닥에 의해서만 액세스되는 데이터와 다른 스레드 또는 가닥과 공유되는 데이터에 액세스합니다.

+0

설명해 주셔서 감사합니다. 배치 작업 처리를 자극하기 위해 스트랜드를 사용할 수 있다고 생각했습니다.그렇게 할 방법이 있다는 것을 알고 있습니까? 감사. –

+0

나는 당신이하려는 것을 이해하고 있는지 잘 모르겠습니다. –

+0

편집 한 내용을 제 질문에 답변 할 수 있습니다. 감사합니다 –