inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해

3) 디스패치 배리어(Dispatch Barrier), 4) 객체 설계시 주의할 점

global()에서는 배리어가 동작하지 않는 것 같아요

해결된 질문

221

IOI

작성한 질문수 1

2

아래는 제가 강의를 듣고 임의로 만들어본 예제입니다. concurrentQueue를 custom 큐로 만들어주면 잘 동작하는 반면 global()을 사용하면 배리어가 동작하지 않았습니다. 왜 이런건가요?

import Foundation

var shared: Int = 0

let group = DispatchGroup()

let concurrentQueue = DispatchQueue(label: "com.raywenderlich.number.isolation", attributes: .concurrent)

 

for _ in (1...30) {

  concurrentQueue.async(group: group) {

      print(shared, terminator: "")

  }

}

concurrentQueue.async(group: group, flags: .barrier) {

    print("")

    print("Barrier In")

    shared += 1

    sleep(3)

    print("Barrier Out")

}

for _ in (1...30) {

    concurrentQueue.async(group: group) {

        print(shared, terminator: "")

    }

}

 

group.wait()

 

swift ios

답변 2

1

IOI

global()은 배리어로 제어할 스레드를 규정하기 어렵겠네요~ 이해되었습니다 감사합니다!

1

앨런(Allen)

안녕하세요! IOI 님!

글로벌큐 같은 경우에는.. global 이라는 의미("전반적인/ 일반적인")에서 볼 수 있듯이 

원칙적으로는.. 비동기처리를 위해서, 편하게 막 가져다 쓰라고(?) 만들어 놓은 목적때문에

실제로는 OS에서 글로벌큐를 관리할때, 내부 쓰레드 객체들이 자주 바뀌기도 하고 그렇습니다.
(생겼다가 없어졌다가)
그리고 예를 들어서, 2~ 5번 쓰레드를 쓰다가.. 여력이 남으면 6 ~ 8번쓰레드로 사용하고... 등등 일반 글로벌큐는 약간 이런 특성이 있긴 있습니다.


그래서.. 특히나, "배리어 작업"에서만큼은 아예 특정한 목적에서 만들어 놓은 큐를 써야지 (내부 쓰레드 객체가 변하지 않고, 예를 들어 딱 정해진 2 ~ 5번 쓰레드만 사용) 원하시는 목적에 정확하게 동작하도록 설계가 가능하긴 합니다. :)


혹시나 내부 쓰레드 객체가 바뀌는 문제와 관련해서는.. 
바로 아래 아래 답변 중에 "Serial queue가 한개의 쓰레드를 사용한다는 내용에 질문..." 이 부분 대략적으로 읽어보시면 조금 도움이 될 것 같아요.


고맙습니다!

오퍼레이션 큐 질문

0

147

2

2) 오퍼레이션큐(OperationQueue) 강의 질문입니다

0

153

2

warning 뜸

0

169

1

수업자료 markup 에 대해 궁금합니다!

0

285

1

예제 프로젝트 빌드 실패

0

344

2

serial 큐 질문드립니다.

0

261

1

[7-3.DispatchBarrier] 예제 코드 질문

0

337

1

안녕하세요, GCD 관련 질문드립니다..

0

292

1

main.async 작동 질문(+ vs global(),async)

0

442

1

dismiss 되었을 때 종료질문

0

314

1

'동기'와 '동시성 프로그래밍'에 대해 질문드립니다.

0

511

2

Dependency Protocol 관련

1

376

1

시리얼 큐와 sync 관련

0

477

2

sync이지만 Queue에 넣으면 async로 동작한다는 말의 의미

0

658

1

lazy var 이슈로 생긴 여러 변수들은 어디에 있나요?

0

391

1

global큐에 sync로 작업을 보냈을 때는 터지지 않는 이유가 궁금합니다.

1

518

2

비동기 개념에서 무엇을 return하는 거죠??

0

398

1

안녕하세욤

1

349

1

Barrier 작업 관련 질문입니다.

1

350

1

디스패치 그룹

1

386

1

global async안에 global async를 만들게되면 어떻게 되나요??

2

393

2

동기적 함수를 비동기적 함수로 바꾸는 부분에서 질문 있습니다

1

296

2

비동기오퍼레이션 관련 질문

1

378

1

강의자료는 어디에 있나요?

1

328

1