2015-01-21 4 views
0

아래는 나의 사용 사례입니다.더 빠른 atomic_compare_and_swap 또는 spin trylock은 어느 것입니까?

전역 변수가 하나 있고 모든 CPU에서 여러 스레드가이 변수에 액세스하고 있습니다. 원자와

비교하고 스핀 설정된 tryLock

for(;;) 
    { 
     auto temp = go_for_work(); 
     if (temp -> spin.trylock() == 0) 
     { 
      continue; 
     } 

    } 

... go_for_work 
{ 
    auto old = global_var; 
    auto new_var = old 
    new_var++; 
    global_var = new_var; 
    return new_var 
} 

이 내가 분명히 희망 거친 코드와 교환

auto old = global_var; 
auto new_var = old 
for (;;) { 
      new++; 
      bool got_it = atomic_compare_and_swap(global_var, 
            old, 
            new_var); 
      if (got_it) { 
       return new_var; 
      } 
      old = global_var; 
      new_var = old; 
    } 

. 명확하지 않은 경우 알려주십시오.

global_var은 int 구조체가 아닙니다.

그래서, 내 주요 목표는 하나 더 빠른 atomic_compare_and_swap 또는 spin.trylock()입니다 global_var 보호하는 것입니다, 또 다른 기술?

+3

사이드 노트 : C++ 키워드 인 변수 new에 이름을 지정하지 마십시오 – CoryKramer

+3

두 가지 모두 바쁜 루프입니다 - 차이점이 없습니다 (둘 다 잘못됨) –

+1

'global_var'유형이 필수이면, 원자 증분을 사용하십시오. – jxh

답변

0

차단 테스트를 사용해야합니다. 스핀 락과 같은 논 블로킹 테스트는 테스트와 절전 모드에서 반복적으로 많은 프로세서 사이클을 소모하므로 다른 모든 프로세스에 피해를줍니다. 세마포어를 사용 해보세요