2012-11-30 5 views
0

데이터가 정기적으로 업데이트되는 사용 사례가 있습니다. 그러나 데이터를 읽는 스레드가 여러 개있을 것입니다. 그래서 우리가 생각하고있는 솔루션은 이중 버퍼를 사용하는 것입니다. 따라서 소비자 스레드는 포 그라운드 페이지를 읽는 반면 제작자는 백그라운드 페이지를 업데이트합니다. 제작자가 배경 페이지를 업데이트하면 전경 페이지를이 페이지 으로 잠그지 않고 교환합니다. 데이터가 동일하거나 다르므로 조작에 영향을 미치지 않으므로 여전히 신경 쓰지 않습니다. 이제 문제는 제가 전통적인 생산자의 소비자 문제를 알고있는 것처럼 어떻게해야할까요. 제가 동일한 작업을 위해 두 개의 버퍼를 사용할 수 있고 물건을 회전시킬 수는 있지만 문제는 교환해야합니다. 자물쇠가 있어야 할 필요가 있습니다. 피하고 싶다.단일 제작자 및 다중 소비자에서 잠금없이 버퍼 스왑

어떻게 수행 할 수 있습니까? 이 점에있어서 어떤 포인터라도 좋습니다.

+1

은 어떻게 생산자와 소비자를 동기화하는 방법은 무엇입니까? 생산자가 매우 동일한 페이지로 바꾸고 글쓰기를 결정할 때 전경 페이지를 읽는 소비자는 어떻게됩니까? – chill

+0

전경과 배경 데이터가 거의 동일하므로 제작자와 소비자를 동기화하는 것에 대해 걱정하지 않습니다. 인덱스를 사용하기 때문에 일부 소비자는 이전 페이지를 읽고 일부 소비자는 새 페이지를 읽지 만 나중에 모든 소비자는 공통 데이터를 읽습니다. 우리는 데이터를 교환하는 동안 잠금을 원하지 않는다는 것을 알면됩니다. 따라서 버퍼의 잠금없는 전환을 모색했습니다. – Abhinav

답변

1

기술적으로는, 실제의 교환에 의해 수행 될 수

  • C++ 11 개 원자 기능 - 예컨대 std::atomic_echange, std::atomic_exchange_explicit
  • 인라인 어셈블리 - 예컨대 인텔 lock xchg
  • GCC 내장 기능 - __atomic_exchange 이상 __sync_lock_test_and_set
  • MSVC 기능 - InterlockedExchangePointer
관련 문제