<commit_before>---
layout:     post
title:      swift semaphore
date:       2018-12-12 08:00:00
summary:    Swift semaphore 알아보기
categories: swift
---

세마포어를 사용하기전에 세마포어가 왜 생겼는지 알아보자

하나의 자원에 접근할때 동시에 여러 쓰레드에서 그 하나의 자원에 접근한다면?

```Swift

var array = [Int]()

DispatchQueue.global().async {
    for element in 0...1000 {
        array.append(element)
    }
}

DispatchQueue.global().async {
    for element in 0...1000 {
        array.append(element)
    }
}

```

```Swift

malloc: *** error for object 0x10b4d6cb0: pointer being freed was not allocated
malloc: *** set a breakpoint in malloc_error_break to debug

```

이렇게 에러가 난다.

이렇게 하나의 자원에 여러 곳에서 접근을 하는 것을 레이스 컨디션(Race Condition)이라고 한다.

> 레이스 컨디션: 한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상

동시 접근문제를 발생시킬수 있는 코드 블록을 임계영역이라고 한다.

동시 접근문제를 해결하기 위한 동기화 기법이 크리티컬 섹션(Critical Section) 이라고 하고,
크리티컬 섹션 기법이 세마포어, 뮤텍스 등이 있다.

- 뮤택스는 한정된 자원에 하나만 접근 가능하고

- 세마포어는 한정된 자원에 하나 이상이 접근할 수 있다.

Swift 에서는 세마포어를 사용하기 위한 `DispatchSemaphore` 클래스가 있다.

`DispatchSemaphore`를 생성할때 자원에 접근할 수 있는 갯수를 준다.

```Swift

let semaphore = DispatchSemaphore(value: 10)

```

이렇게 하면 10개가 자원에 접근할수 있다.

```Swift

DispatchSemaphore(value: 1)

```

로 하면 하나만 자원에 접근할수 있고 뮤택스처럼 사용할수 있다.

`DispatchSemaphore`의 메서드에는

- wait: value값이 -1 작아진다.
<commit_msg>Update 2018-12-12-swift-semaphore.md<commit_after>---
layout:     post
title:      swift semaphore
date:       2018-12-12 08:00:00
summary:    Swift semaphore 알아보기
categories: swift
---

세마포어를 사용하기전에 세마포어가 왜 생겼는지 알아보자

하나의 자원에 접근할때 동시에 여러 쓰레드에서 그 하나의 자원에 접근한다면?

```Swift

var array = [Int]()

DispatchQueue.global().async {
    for element in 0...1000 {
        array.append(element)
    }
}

DispatchQueue.global().async {
    for element in 0...1000 {
        array.append(element)
    }
}

```

```Swift

malloc: *** error for object 0x10b4d6cb0: pointer being freed was not allocated
malloc: *** set a breakpoint in malloc_error_break to debug

```

이렇게 에러가 난다.

이렇게 하나의 자원에 여러 곳에서 접근을 하는 것을 레이스 컨디션(Race Condition)이라고 한다.

> 레이스 컨디션: 한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상

동시 접근문제를 발생시킬수 있는 코드 블록을 크리티컬 섹션(Critical Section)이라고 한다. 임계영역이라고도 한다.

동시 접근문제를 해결하기 위한 동기화 기법이 세마포어, 뮤텍스 등이 있다.

- 뮤택스는 한정된 자원에 하나만 접근 가능하고

- 세마포어는 한정된 자원에 하나 이상이 접근할 수 있다.

Swift 에서는 세마포어를 사용하기 위한 `DispatchSemaphore` 클래스가 있다.

`DispatchSemaphore`를 생성할때 자원에 접근할 수 있는 갯수를 준다.

```Swift

let semaphore = DispatchSemaphore(value: 10)

```

이렇게 하면 10개가 자원에 접근할수 있다.

```Swift

DispatchSemaphore(value: 1)

```

로 하면 하나만 자원에 접근할수 있고 뮤택스처럼 사용할수 있다.

`DispatchSemaphore`의 메서드에는

- wait: value값이 -1 작아진다.

{'fraction_non_alphanumeric': 0.09614636045153756, 'fraction_numerical': 0.031140521603736863, 'mean_word_length': 3.053627760252366, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7469356', 'n_tokens_mistral': 1686, 'n_tokens_neox': 1999, 'n_words': 359}