Search
πŸ’Ύ

16: Lock-based Concurrent Data Structures

course
last review
mastery
none
progress
not started
date
2023/05/02
4 more properties
Previous chapter

Main QUEST

νŠΉμ • μžλ£Œκ΅¬μ‘°κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ–΄λ–€ λ°©μ‹μœΌλ‘œ 락을 μΆ”κ°€ν•΄μ•Ό κ·Έ 자료 ꡬ쑰가 μ •ν™•ν•˜κ²Œ λ™μž‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆμ„κΉŒ? λ‹€μˆ˜μ˜ μŠ€λ ˆμŠ€κ°€ ν•΄λ‹Ή 자료ꡬ쑰λ₯Ό λ™μ‹œμ— μ ‘κ·Όν•˜λ„λ‘ ν•΄μ„œ μ„±λŠ₯을 μ–΄λ–»κ²Œ ν–₯μƒμ‹œν‚¬ 수 μžˆμ„κΉŒ?
μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 접근해도 경쟁쑰건 없이 μ•ˆμ „ν•˜κ²Œ μž‘λ™ν•˜λŠ” 것을 thread safeμƒνƒœλΌκ³  ν•œλ‹€.
λ˜ν•œ μ–Όλ§ˆλ‚˜ λ™μ‹œμ— μ ‘κ·Όκ°€λŠ₯ν•˜λ„λ‘ ν•  지도 κ³ λ €ν•˜λŠ” 것이 쒋을 것이닀.

Concurrent Counter

typedef struct __counter_t { int value; pthread_mutex_t lock; } counter_t; void init(counter_t *c) { c->value = 0; pthread_mutex_init(&c->lock, NULL); }
C
볡사
μΌλ°˜μ μœΌλ‘œμΉ΄μš΄ν„°μš© λ³€μˆ˜ + 락을 ν•˜λ‚˜μ˜ ꡬ쑰체둜 μ„ μ–Έν•˜μ—¬ 닀룬닀.
void increment(counter_t *c) { pthread_mutex_lock(&c->lock); c->value++; pthread_mutex_unlock(&c->lock); } void decrement(counter_t *c) { pthread_mutex_lock(&c->lock); c->value--; pthread_mutex_unlock(&c->lock); } int get(counter_t *c) { pthread_mutex_lock(&c->lock); int rc = c->value; pthread_mutex_unlock(&c->lock); return rc; }
C
볡사
γ…‡
μœ„ ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œλ§Œ κ°€μ Έμ˜¬ 수 μžˆλ„λ‘ ν•œλ‹€! (μΌμ’…μ˜ getter와 setter같은 λŠλ‚ŒμΈ)

Simple, But no Extension

Scalable Counting

β†’ κΌ­ μ •λ¦¬ν•˜μ‹œμ˜€β€¦

Concurrent Linked List

typedef struct __node_t { int key; struct __node_t *next; } node_t; typedef struct __list_t { node_t *head; pthread_mutex_t lock; } list_t; void List_Init(list_t *L) { L->head = NULL; pthread_mutex_init(&L->lock, NULL); }
C
볡사
int List_Insert(list_t *L, int key) { pthread_mutex_lock(&L->lock); node_t *new = malloc(sizeof(node_t)); if (new == NULL) { perror("malloc"); pthread_mutex_unlock(&L->lock); return -1; // fail } new->key = key; new->next = L->head; L->head = new; pthread_mutex_unlock(&L->lock); return 0; // success }
C
볡사
int List_Lookup(list_t *L, int key) { pthread_mutex_lock(&L->lock); node_t *curr = L->head; while (curr) { if (curr->key == key) { pthread_mutex_unlock(&L->lock); return 0; // success } curr = curr->next; } pthread_mutex_unlock(&L->lock); return -1; // failure }
C
볡사

Concurrent Queue

Concurrent Hash Table

Conclusion

Next chapter