Skip to content

Instantly share code, notes, and snippets.

@devxoul
Last active October 22, 2019 13:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devxoul/57006fee632c7141aa336589f676f44f to your computer and use it in GitHub Desktop.
Save devxoul/57006fee632c7141aa336589f676f44f to your computer and use it in GitHub Desktop.
import Foundation
let queue = DispatchQueue(label: "test")
var threads: [Thread] = []
for _ in 0..<100 {
queue.async {
threads.append(Thread.current)
// 1) if this line is not commented out
// 2) if this line is commented out
// return ()
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
for thread in threads {
print(thread)
}
}

1) When not commenting out

for _ in 0..<100 {
  queue.async {
    threads.append(Thread.current)
    return ()
  }
}

All the threads are same.

<NSThread: 0x600003c85300>{number = 3, name = main}
<NSThread: 0x600003c85300>{number = 3, name = main}
<NSThread: 0x600003c85300>{number = 3, name = main}
...
<NSThread: 0x600003c85300>{number = 3, name = main}
<NSThread: 0x600003c85300>{number = 3, name = main}
<NSThread: 0x600003c85300>{number = 3, name = main}

2) When commenting out

for _ in 0..<100 {
  queue.async {
    threads.append(Thread.current)
  }
}

Not all the threads are same.

<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
...
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009a02c0>{number = 3, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
...
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009d0200>{number = 5, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
<NSThread: 0x6000009d4f00>{number = 7, name = main}
@mud0107
Copy link

mud0107 commented Oct 22, 2019

제가 가진 컴퓨터에서 테스트 한 결과 위 올린 결과와 완전다릅니다.
즉, 결론부터 2가지 경우는 없습니다.
retrun 는 들어간다고 햇어 14개가 만들고 나가지 않아요.!
시스템에서 어떤 상태인지가 더 중요합니다. 즉, 하나의쓰레드가 모든걸 다 수용할 수 있는지 없는지에 따라서 같은 쓰레에서 실행되냐 안되나입니다.
현재 만든 큐는 시리얼이기때문 여기저기 분배시키기보단 일단 현재 실행중인 쓰레드 큐에 다 집어 넣어보고 그래도 안되면 빠지는것 같습니다.
현재 전 아이맥프로 18코어 , 램 128기가에서 테스트 했습니다.
10만개루는 결과 둘다 같은 쓰레드 번호를 가집니다.
한 백만개 정도 루프 돌리니 결과가 달라졌습니다.
둘다 결론은 같습니다.
그리고 name : 현재 실행되는 쓰레드의 이름입니다.
func test() {
let queue = DispatchQueue(label: "test")
var threads: [Thread] = []

for _ in 0..<1_000_000 {
  queue.async {
    threads.append(Thread.current)
    return ()
  }
}

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
  print("Thread Count :\(threads.count)")
  
    queue.async {
      for thread in threads {
        print(thread) // 쓰레드 이름을 보기위해 다르게 해봤습니다.
    }
  }
}

print(threads.count)

}

스크린샷 2019-10-22 오후 10 44 48

스크린샷 2019-10-22 오후 10 46 11

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment