transactional_memory — 트랜잭션 메모리
transactional_memory — 트랜잭션 메모리 (Transactional memory)
**트랜잭션 메모리(transactional memory)**는 문장들의 그룹을 트랜잭션으로 묶는 동시성 동기화 메커니즘이에요. 실험적 기능(TS ISO/IEC TS 19841:2015)이에요.
트랜잭션은 다음과 같은 성질을 가져요.
- 원자적(atomic) — 모든 문장이 발생하거나, 아무것도 발생하지 않음
- 격리(isolated) — 트랜잭션의 문장은 다른 트랜잭션이 쓴 반쯤 쓰인 쓰기를 관찰하지 못해요 (병렬로 실행되더라도)
출처: cppreference
본문
트랜잭션은 synchronized와 atomic 블록으로 표현돼요.
// synchronized 블록 — 다른 synchronized 블록과 상호 배타적
synchronized {
// 여러 문장
if (condition) {
// ...
}
}
// atomic 블록 — 원자적으로 실행
atomic {
// 이 블록은 완전히 실행되거나 전혀 실행되지 않음
}
이 개념은 락(lock)을 직접 관리하는 것보다 확장성(scalability)을 높이려는 목표를 가져요. 트랜잭션이 충돌하지 않으면 병렬로 실행되고, 충돌이 감지되면 하나만 성공하고 다른 것은 재시도(retry)되거나 중단(abort)돼요.
// 전통적인 락
std::mutex m;
void transfer(Account& a, Account& b, int amt) {
std::lock_guard<std::mutex> lk(m);
// 원자적 업데이트
a.balance -= amt;
b.balance += amt;
}
주의할 점:
- 이 기능은 **표준이 아니라 기술 사양(TS)**이며, 공식 C++ 표준(예: C++20)에는 포함되지 않았어요. 대부분의 컴파일러에서 실험적으로만 제공돼요.
- "Work in progress" 페이지로, 완전히 표준화되지 않았어요.
- 트랜잭션 안에서는 어떤 외부 효과(I/O, 휘발성 접근)도 허용되지 않을 수 있어요.
트랜잭션 메모리는 락 기반 동기화의 대안으로 연구돼 왔지만, 실용적으로는 여전히 뮤텍스와 원자 연산이 표준이에요.