Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 메모리 배리어
- 백트래킹
- 백준
- 완전탐색
- 프론트엔드 스쿨
- 코딩테스트 스터디
- 구조체
- 제로베이스 프론트엔드 스쿨
- 서버
- c#
- 코딩테스트
- 제로베이스
- 문자열&연산자
- JavaScript
- dfs
- Algorithm
- 프로그래머스
- 멀티스레드
- Server
- BFS
- React
- 구현
- map
- C++
- 자바스크립트
- MemoryBarrier
- N과 M(2)
- leetcode
- 알고리즘
- socket
Archives
- Today
- Total
Written
SpinLock 본문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace client
{
//SpinLock
class SpinLock
{
volatile int _locked = 0;
public void Acquire()
{
//1
//while (true)
//{
// int original = Interlocked.Exchange(ref _locked, 1);
// if (original == 0)
// break;
//}
//2 CAS사용
while (true)
{
int desired = 1;
int expected = 0;
int original = Interlocked.CompareExchange(ref _locked, desired, expected);
if (original == expected)
break;
}
}
public void Release()
{
_locked = 0;
}
}
class Program
{
static int _num = 0;
static SpinLock _lock = new SpinLock();
static void Thread_1()
{
for (int i = 0; i < 10000; i++)
{
_lock.Acquire();
_num++;
_lock.Release();
}
}
static void Thread_2()
{
for (int i = 0; i < 10000; i++)
{
_lock.Acquire();
_num--;
_lock.Release();
}
}
static void Main(string[] args)
{
Task t1 = new Task(Thread_1);
Task t2 = new Task(Thread_2);
t1.Start();
t2.Start();
Task.WaitAll(t1, t2);
Console.WriteLine($"{_num}");
}
}
}
|
cs |
=> SpinLock은 Lock을 구현하는 여러 방법 중 하나의 방식이다.
=> 기존의 lock을 소유하고 있는 스레드가 lock을 반납할 때 까지 다른 스레드에선 lock을 획득하지 못한다.
=> 코드를 보면 경합을 방지할 수 있는 Interlocked 계열의 함수를 사용하여 lock의 획득을 구현하고있다. 그 이유는 만약 t1과 t2 스레드가 동시에 달려들어 lock을 획득하게 되면 lock의 상태를 false로 만들 수 없기 때문에 무한루프에서 빠져나올 수 없기 때문이다. 위처럼 구현하면 그러한 부작용없이, 다른 스레드가 만약 lock을 차지하고 있다면 무한루프를 계속 돌면서 lock을 반납할 때 까지 기다리다가, _locked가 0이되어 lock을 소유하고 있는 스레드가 반납을 하게되면 그제서야 lock 획득이 가능하다.
'Server > 멀티스레드' 카테고리의 다른 글
DeadLock (0) | 2023.07.21 |
---|---|
메모리 배리어 (0) | 2023.07.18 |
캐시(Cache) 이론 (0) | 2023.07.18 |
Comments