728x90
이전글에서 설명한 안습한 결론에 좌절한 후, 좀 더 빠른 lock-free 구조체가 없을까 하고 뒤지던 도중 ConcurrentQueue라는 걸 발견했습니다.
.net 4 이후 버전에서만 동작하고, 멀티스레드에 대해 안전하다고 하는군요.
설명은 아래 위치에서 볼 수 있습니다.
http://msdn.microsoft.com/ko-kr/library/dd267265(v=vs.100).aspx
Interlocked도 그렇고, C#은 역시 그냥 만들어 놓은거 가져다 쓰는게 최고인 언어인지라 그대로 적용해 보았습니다.
public void request2()
{
queryQueue2.Enqueue(1);
}
public void update2()
{
int t;
while (!isEnd || !queryQueue2.IsEmpty)
{
if(queryQueue2.TryDequeue(out t))
m += t;
}
}
그리고 대망의 실행 결과...
테스트5가 ConcurrectQueue를 쓴 결과입니다. 1이 그냥 큐에 락 걸어서 돌린 거고 2는 공유 객체(변수 m) 자체에 락을 걸고 큐를 아예 쓰지 않은 경우.
이것저것 다른 프로그램 띄워놓고 돌린거라 오차가 꽤 크지만, 어쨌든 성능이 확 좋아진 건 확실하군요.
실제 게임 서버 같은 곳에서는 update()에서 처리할 것도 많고 락 걸어야 하는 범위도 넓다는 걸 생각하면 실용성을 생각해도 될 만한 성능인 것 같습니다.
역시 C#은 있는거 가져다 쓰라고 만든 언어입니다...
'개발언어 > C#' 카테고리의 다른 글
[C#] config 파일을 AppData 폴더에 두고 설정값 읽기 및 쓰기 (0) | 2021.03.29 |
---|---|
[C#] Static함수에서 Form의 Control 조작하는 방법 (0) | 2021.03.05 |
[C#] Queue VS ConcurrentQueue (0) | 2021.02.17 |
[C#] Queue, ConcurrentQueue 기본사용법 (0) | 2021.02.17 |
[C#] winform 색상표 (0) | 2021.02.05 |