누구나 나에게 스레딩을 이해하는 데 도움이되는 프로젝트를 제안 할 수 있습니까?


13

저는 현재 스레딩에 대한 꽤 흔들리는 이해를 가진 C # 개발자입니다.

이 두 링크는 ​​다른 게시물에서 제안되었습니다.

http://www.yoda.arachsys.com/csharp/threads/

http://www.albahari.com/threading/

기본으로 돌아가서 주제에 대한 컴퓨터 과학 텍스트를 살펴 볼까요?

실제로 c # 라이브러리를 사용하고 사용하면 빌드 할 지식의 탄탄한 기초가 실제로 없다고 생각합니다. 나는 com-sci 학생처럼이 주제를 처음부터 배우고 C # 라이브러리를 사용해야한다고 생각합니다.

누구나 스레딩 학습, 일부 링크 및 프로젝트 아이디어에 대한 접근 방식을 제안 할 수 있습니까?

미리 감사드립니다!

모든 답장을 보내 주셔서 감사합니다. 어떤 사람들은 책이 좋은 생각 일 수 있다고 언급했습니다. 언어에 구애받지 않는 것을 선호합니다. 이 과목이 컴퓨터 과학 학위에서 어떤 수업에 포함될 것인지 아는 사람이 있습니까? 무료 온라인 메모 및 과제를 위해 Google에 노력하고 있습니다.


이것이 도움이되는지 모르겠지만 이것은 스레딩의 기본 개념을 설명하는 VB.Net에서 조금 쓴 간단한 튜토리얼입니다. C #으로 쉽게 변환 할 수 있어야합니다. chrishaas.wordpress.com/2009/06/25/…
Chris Haas

나는 스레드로 할 수 있고 제 정신을 유지하는 것이 가능한 한계를 가르치기 위해 멀티 스레드 GUI를 작성하는 것이 좋습니다. 그러나 그것은 건설적이지 않을 것입니다. 그래서 나는 대답이 아니라 의견으로 타게 할 것입니다… :-)
Donal Fellows

답변:


3

다중 스레드 웹 서버를 작성하십시오. 당신은 TON 을 배울 것 입니다. 스레딩뿐만 아니라


4

생산자-소비자 문제는 전형적인 예이며 스레딩뿐만 아니라 프로세서 스케줄링 (스레드와 달리 자식 프로세스에 fork ()를 사용하여 설명 할 수 있음)과 프로그램이 운영 체제와 어떻게 상호 작용하는지 이해하는 데 도움이됩니다. 장면.

스레딩 / 포킹과 관련하여 알아야 할 중요한 사항은 다음과 같습니다. 1. 운영 체제가 작업을 예약하는 방법 (예 : 라운드 로빈 알고리즘) 2. 리소스 잠금 (여러 스레드가 동일한 리소스를 사용하는 경우 원하지 않는 경우) 동시에 액세스-나쁜 일이 생겼습니다)

이 고전적인 문제에 대한 위키 기사는 다음과 같습니다. http://en.wikipedia.org/wiki/Producer-consumer_problem

기본적으로 "소비자"스레드를 생성하는 "프로듀서"를 작성하십시오. 생산자는 "자원"을 생산하고 소비자는 소비합니다. 루프에 넣고 무슨 일이 일어나는지 지켜보십시오 (결국 소비자는 동기화되지 않은 방법으로 인해 더 많은 리소스를 소비하고 사용할 수 있다는 것에 놀랄 것입니다).


흥미롭게도, 스레드 된 Windows 서비스를 작성하는 동안이를 인식하지 않고이 패턴을 설정 한 것 같습니다. 당신의 설명은 완벽했습니다. 알아야 할 좋은 점은, 이것이 공개 질문에 대한 답변으로 표시되는 것입니다.
Tony

2

고전적인 병렬 문제 중 하나를 선택하십시오. 초 선형 속도 향상으로 하나를 선택하는 것이 더 흥미로울 수 있습니다.

정렬되지 않은 인덱싱되지 않은 목록을 검색해보십시오. 이 문제는 사소한 문제입니다. 먼저 단일 스레드 검색을 구현 ​​한 다음 순진한 병렬 검색을 구현하십시오. 작업 스털링을 구현하십시오. 임의의 데이터 세트를 생성하고 동일한 데이터 세트에서 세 가지 버전을 모두 실행하십시오. 속도 향상을 계산하십시오.


0

교과서가 차선책이라고 생각하지 않습니다. 프로젝트는 갈 길입니다. 당신이 흥분하는 것이어야합니다.

스레딩을 처음 수행했을 때 웹 크롤러의 성능을 향상시키고있었습니다. 직렬로 모든 네트워크 IO를 수행하지 않으면 훨씬 빠르게 크롤링 할 수 있습니다. 이것은 몇 가지 방법으로 접근 할 수 있기 때문에 시작하기에 좋은 프로젝트이지만 멀티 스레드 GUI 프로그래밍만큼 복잡하지는 않습니다. 또한 많은 전문 기술이 필요하지 않습니다 (예 : 무거운 계산 작업).

따라서 정보를 알아 내고 해킹을 시작하십시오. 무언가를 얻는 데 시간이 오래 걸리지 않아야합니다. 부드럽게 소개됩니다.


프로젝트에 동의하지만 네트워크 I / O는 스레드의 좋은 사용 사례가 아닙니다. 비 차단 I / O는 스레드로 해결 된 동일한 문제보다 더 효율적이고 더 적은 리소스를 사용하며 경쟁 조건 및 코너 사례가 적습니다. 쓰레드가 이상적이지 않을 때 좋은 병렬 프로그래머가되기위한 학습의 일부는 인식하고있다.
벤 Voigt

내가 말한 경험은 매우 기본적인 파이썬 웹 스크래핑이었습니다. 여기에서 약 8 줄의 코드를 추가하여 멀티 스레드로 만들었습니다. 기존 코드와 비동기식으로 수행하는 것이 쉽지 않았을 지 모르지만 내가 잘못했는지 / 어떻게 알고 있는지 알고 싶습니다. 나는 훌륭한 병렬 프로그래머가되기위한 학습의 일부는 당신의 벨트 아래에서 많은 경험을 쌓는 것일 수 있다고 생각한다. :
Henry

0

간단한 스파이 대 스파이 앱을 모델링하십시오.

각 스파이는 별도의 스레드에서 실행됩니다.

각 스파이는 다른 스파이에게 피해를 줄 수는 있지만 직접적으로는 아닙니다.

각 스파이는 다른 스파이로부터 귀중한 자원을 훔칠 수 있지만 직접적으로는 불가능합니다.

두 스파이는 자원을 제한적으로 보유하고 있으며 공유해야합니다. 한 번에 하나의 스파이 만이 주어진 자원을 사용할 수 있습니다.


0

머릿속에서 : Bruce Eckel 's Book "Thinking in Java" 의 제 4 판 은 스레딩에 대한 장이 매우 길다 (100 페이지 이상-그 자체로는 거의 작은 책). 나는이 책의 이전 판을 읽었으므로이 장을 읽지 않았다. 그러나 나는 그의 블로그 게시물 (또는 그의 책의 릴리스 노트) 중 하나를 기억합니다. 그는 이것을 작성하는 것이 매우 어려웠으며 결국 그에게 진정한 성취라고 주장했습니다. 확인 해봐...

이 외에도이 상용 교육 사이트에는이 2.5 시간짜리 비디오 코스가 있지만 무료 평가판을받을 수 있습니다 (신용 카드 데이터를 남겨 두어야합니다. 구독 취소하는 것을 잊지 마십시오).

http://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=clr-threading


0

기본으로 돌아가서 주제에 대한 컴퓨터 과학 텍스트를 살펴 볼까요?

그것은 항상 좋은 선택이며 스레딩에 익숙해지기 위해 좋은 스레딩 북을 선택하는 것이 좋습니다. Java에서 멀티 스레딩을 배웠고 지식은 C #으로 쉽게 번역되었습니다.

실용적인 예를 원한다면 식사 철학자 문제 를 시도하는 것이 좋습니다 .

멀티 스레딩을 시작할 때 몇 가지 사항을 배워야합니다.

  1. 동기화하는 여러 가지 방법 (세마포어, 뮤텍스 등)
  2. 원자 연산 (C #에서는 기본적으로 원자가 아닌 연산에 대해 Interlocked를 통해 수행됨).
  3. 잠금없는 동시 프로그래밍.
  4. 대기없는 동시 프로그래밍.
  5. 스레드, ThreadPools, BackgroundWorkers 등

나는 지금 다른 것들을 생각할 수 없다. 알바 하리 튜토리얼은 정말 좋아 보인다!


불행하게도 식사 철학자는 유용한 문제가 아닙니다. 경쟁 조건을 시연하기위한 것이지만 교착 상태가 실제로 발생하는지 여부는 시스템 스케줄러, 다른 작업, 하드웨어 인터럽트의 미묘한 영향을받습니다 ... 간단히 말하면 완전히 결정적이지 않으며 이것이 좋은 곳이 아니라고 생각합니다. 학습을 시작하십시오.
벤 Voigt

1
@ Ben Voigt, 나는 식사 철학자들의 문제가 결정적이지 않다는 데 동의하지만, 스레딩 문제의 대부분은 결정적이지 않다고 말하고 싶습니다. 동시 프로그래밍 수업을 들었을 때 그것은 우리가 한 첫 번째 연습 중 하나였습니다. 이제 교사가 반드시 옳았다 고 주장하지는 않지만 확실히 내가 가진 최고의 교사 중 하나이며 설명하고 가르 칠 수있는 능력 중 하나였습니다. 동시성은 훌륭했습니다. DPP는 교착 상태라는 한 가지 유형의 동시성 문제 만 보여줍니다. OP는 경쟁 조건, ABA 문제 등도 조사해야합니다.
Kiril

@Lirik : 물론, 식사 철학자들의 문제를 이해하십시오. 그러나 나는 그것을 구현하지 않을 것입니다. 잘못된 코드를 작성하는 것은 깨기 힘든 습관이 될 수 있습니다.
벤 Voigt

@Ben Voigt, 죄송합니다, 뭔가 빠졌을 것 입니다. 외식 철학자 문제의 요점은 교착 상태 가 아닌 프로그램을 작성 하는 것입니다. 따라서 DPP를 해결하려면 어떻게 "잘못된 코드"를 작성해야합니까?
Kiril
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.