사용자 도구

사이트 도구


kb:interlockedapi

Interlocked API

항상 리턴값 가지고 생각해보는 것이 핵심…일까?

1. API

1.1. InterlockedIncrement/InterlockedDecrement

  • 레퍼런스 카운팅 관련 코드에 사용할 수 있다.
  • 객체 갯수 카운팅 관련 코드에 사용할 수 있다.
    volatile long g_InstanceCount = 0;
    ...
    class foo
    {
        foo() { InterlockedIncrement(&g_InstanceCount); }
        ~foo() { InterlockedDecrement(&g_InstanceCount); }
    };

1.2. InterlockedExchangeAdd

  • 하나의 버퍼에 여러 스레드가 동시에 접근해서 뭔가를 할 때 유용하다.
    char buf[1024];
    volatile long size = 0;
    ...
    long length = 4;
    long prev = InterlockedExchangeAdd(&size, length);
    if (prev + length < sizeof(buf))
    {
        // can write
    }

1.3. InterlockedExchange

  • One-time initialization에 사용할 수 있다. 다만 락과는 달리 다른 스레드는 그냥 주루룩 흘러간다는 것이 문제가 될 수도?
    static volatile long g_Init = 0;
    if (InterlockedExchange(&g_Init, 1) == 0)
    {
        ....
    } 
  • 스핀락 구현에도 사용할 수 있다.

1.4. InterlockedCompareExchange

  • InterlockedExchange 함수와 어느 정도 사용 영역이 겹친다. 어찌 명확히 구분할까…?
  • InterlockedExchange 함수가 Lock 걸고 작업 수행하는 것이라면, InterlockedCompareExchange는 TryLock 하는 정도?
  • 뭔가 컨텍스트 정보가 더 있고, 이를 확인해야 하는 경우. 예를 들어 프로그램의 상태가 있고, 이 상태 간의 전이가 일정한 방향이어야 하는 경우, 이를 처리하기 용이하다.
    enum
    {
        STATE_IDLE,
        STATE_READY,
        STATE_WORKING,
    };
     
    volatile long g_State = STATE_IDLE;
     
    if (InterlockedCompareExchange(&g_State, STATE_READY, STATE_IDLE) == STATE_IDLE)
    {
        // IDLE -> READY
    }
  • 대부분의 lock-free 자료 구조 구현에 이용한다.

1.5. InterlockedBitXXX

  • InterlockedAnd, InterlockedOr, InterlockedXor, InterlockedBitTestAndSet, InterlockedBitTestAndReset
  • 비트필드에다 대고, InterlockedExchange하는 거라면 보면 된다.

2. Acquire/Release Semantics

  • An operation has acquire semantics if other processors will always see its effect before any subsequent operation's effect.
  • An operation with acquire semantics is one which does not permit subsequent memory operations to be advanced before it.
  • An operation has release semantics if other processors will see every preceding operation's effect before the effect of the operation itself.
  • An operation with release semantics is one which does not permit preceding memory operations to be delayed past it.

3. 링크

kb/interlockedapi.txt · 마지막으로 수정됨: 2014/11/12 16:03 저자 excel96