사용자 도구

사이트 도구


kb:softwaretransactionalmemory

Software Transactional Memory

static void Main()
{
    double myAccount;
    double yourAccount;
 
    myAccount = 1000;
    yourAccount = 500;
 
    double amountToTransfer = 150;
    myAccount -= amountToTransfer;
    yourAccount += amountToTransfer;
}

스레드 세이프하지 않은 코드. +- 하는 부분에서 다른 스레드가 끼어들면 콩가루 된다.

static void Main(string[] args)
{
    INstmObject<double> myAccount;
    INstmObject<double> yourAccount;
 
    myAccount = NstmMemory.CreateObject<double>(1000);
    yourAccount = NstmMemory.CreateObject<double>(500);
 
    using (INstmTransaction tx = NstmMemory.BeginTransaction())
    {
        double amountToTransfer = 150;
 
        myAccount.Write(myAccount.Read() - amountToTransfer);
        yourAccount.Write(yourAccount.Read() + amountToTransfer);
 
        tx.Commit();
    }
 
    Console.WriteLine("My account balance: {0}", myAccount.Read());
    Console.WriteLine("Your account balance: {0}", yourAccount.Read());
}

STM을 통해 스레드 세이프해진 코드. 즉 로직 자체는 건드리지 않으면서 스레드 세이프한 코드를 만드는 데 도움을 주는 장치…라는 느낌. 위키피디어의 설명을 옮겨 보자면…

In computer science, software transactional memory (STM) is a concurrency control mechanism analogous to database transactions for controlling access to shared memory in concurrent computing. It functions as an alternative to lock-based synchronization, and is typically implemented in a lock-free way.

ThreadProgramming이 보편화됨에 따라, 기존의 락을 이용하는 동기화 방식이 너무 복잡하다고 여겨져 나온 대안 정도라는 말이 되겠다.

링크

kb/softwaretransactionalmemory.txt · 마지막으로 수정됨: 2014/11/09 20:41 (바깥 편집)