| import threading |
| from typing import Optional, List, Any |
|
|
| class LockFreeVocabCache: |
| """ |
| Lock-free cache using atomic operations logic for thread-safe access. |
| |
| Uses versioning to detect concurrent modifications (ABA problem prevention). |
| Optimized for read-heavy workloads typical in tokenization. |
| """ |
|
|
| def __init__(self, capacity: int = 8192): |
| self.capacity = capacity |
| |
| assert (capacity & (capacity - 1)) == 0, "Capacity must be power of 2" |
| self.mask = capacity - 1 |
| |
| |
| self.keys: List[Optional[str]] = [None] * capacity |
| self.values: List[Optional[int]] = [None] * capacity |
| self.versions: List[int] = [0] * capacity |
| |
| def get(self, key: str) -> Optional[int]: |
| """ |
| Thread-safe cache lookup using optimistic concurrency[cite: 615]. |
| """ |
| idx = hash(key) & self.mask |
| |
| |
| start_version = self.versions[idx] |
| |
| |
| stored_key = self.keys[idx] |
| stored_value = self.values[idx] |
| |
| |
| end_version = self.versions[idx] |
| |
| |
| if start_version == end_version and stored_key == key: |
| return stored_value |
| |
| return None |
|
|
| def put(self, key: str, value: int) -> None: |
| """ |
| Thread-safe insertion with optimistic collision handling[cite: 627]. |
| """ |
| idx = hash(key) & self.mask |
| |
| |
| |
| |
| |
| current_ver = self.versions[idx] |
| self.versions[idx] = current_ver + 1 |
| |
| self.keys[idx] = key |
| self.values[idx] = value |
| |
| self.versions[idx] = current_ver + 2 |