2013-08-16 4 views
6

최근의 "기술 토론"에서 "어떻게 단일 스레드를 사용하여 멀티 스레딩을 수행합니까?"라는 질문을 받았습니다. 인터뷰 담당자가이 질문을 고려하지 않은 것을 확인한 후, 나는 좋은 점이 없다는 것을 인정해야했습니다 단일 스레드에서 멀티 스레딩을 수행하는 방법에 대한 아이디어 그리고 더 나아가서 나는 약간의 모순을 질문으로 생각했다. 면접관이 제공 한 답변은 "멀티 캐스트 대리인을 사용하여"대리인 및 기본 스레딩을 실제로 이해하지 못했는지 궁금합니다. 나는 그 질문이 어떤 장점을 가지고 있는지, 더 중요한 것은 관련된 대답이 의미가 있는지를 아는 것이 흥미로울 것입니다. 고맙습니다. (우리는 코 루틴 패턴이기 위하여 async/await 패턴을 고려하지 않는 한, .NET에 의해 지원되지 않음)어떻게 단일 스레드를 사용하여 멀티 스레딩을 수행합니까?

+2

* 트릭 질문 *, 그래도 :). –

+2

예; 그는 그가 무슨 말을하고 있는지 전혀 모른다. 정답은 섬유질입니다. – SLaks

+3

@ Slaks 나는 멀티 스레딩이 아니라고 말하고 싶다. – hvd

답변

4

코 루틴은 협동 멀티 스레딩을 시뮬레이션 할 일이다.

비동기 프로그래밍은 멀티 스레드 (적어도 부분적으로 ... 예를 들어 둘 이상의 읽기/쓰기가 동시에 실행 됨)를 시뮬레이트합니다. 둘 다 "스레딩"부분을 숨길 수있는 가능한 솔루션입니다.

비동기 프로그래밍에 대해 자세히 설명하면 단일 스레드 + 비동기 정교 작업을 기반으로 동시에 수백 개의 요청에 응답 할 수있는 전체 웹 서버를 구축 할 수 있습니다. 디스크로부터의 각 읽기는 비동기 적으로 수행됩니다. 연결 클라이언트에 대한 모든 응답은 비동기 적으로 수행됩니다.

이 완전히 비동기 프로그래밍을 기반으로 단일 스레드 웹 서버입니다 Node.js를 내가 이해 무슨에서 이름을 제공하기 위해 https://stackoverflow.com/a/14797359/613130

실시 예를 참조하십시오 ... (기술적으로 비 블로킹 I/O라고도 함) 무엇을 필자는 서면으로, Green threads을 구현하는 몇 가지 언어가 있다고 덧붙일 것입니다. 녹색 스레드는 OS 스케줄러를 사용하지 않는 협업 스레드입니다. 그들의 코드는 하나의 스레드에서 실행됩니다 (적어도 그들의 관점에서). Go, haskell, Old Ruby, 스몰 토크의 다양한 버전은 모두 녹색 스레드를 사용/사용하는 것 같습니다.)

+1

비동기! = 멀티 스레드 만 사용했습니다. 가장 큰 차이점은 비동기 코드의 경우 코드의 전체 "블록"을 한 번에 실행할 수 있으며 다른 전체 블록이 완료되면 코드의 다른 섹션으로 바꿀 수 있다는 것입니다. 다중 스레드 환경에서는 스택 실행을 일시 중지하고 다른 컨텍스트로 스왑 한 다음 이전 컨텍스트로 돌아갈 수 있습니다. 나는 C#이 어떻게 그것을 성취 할 수 있는지를 볼 수 없다. 스레드의 도움 없이는 달성하기에는 너무 높은 수준입니다. – Servy

+1

@Servy 내가 말한 것은 외부 관찰자의 관점에서 비동기 == 다중 스레드이다 : Node.js가 동시에 두 개 이상의 요청을 처리 할 수 ​​있다는 것이다. 사실 비동기식은 다중 쓰레드와 비슷합니다. 왜냐하면 비동기식 쓰래드 중 하나에서 운영체제를 실행할 운영체제를 남겨두고 있기 때문입니다.따라서 프로세스 내부의 멀티 스레딩 대신 프로세스와 OS 전반에 걸쳐 멀티 스레딩을 수행합니다. 그렇습니다, 속담 섬유가 4 개로 갈라 지지만 문제는 적어도 약간의 측면 사고를 요구하는 준 속임수 문제였습니다. – xanatos

+1

하지만이 사실은 멀티 스레딩이 아닙니다. 이것은 질문하는 사람이 실제로 "비동기"가 아닌 "멀티 스레딩"을 의미한다는 것을 의미 할 수 있습니다. 그들이 그렇게했다면 이것은 대답이 될 것입니다. – Servy

관련 문제