Chapter03 멀티스레딩과 동기화 기본

Sdílet
Vložit
  • čas přidán 3. 06. 2022
  • 스레드에 대한 기본적인 설명과 더불어 간단한 윈도우 기반 멀티스레드 예제를 함께 다룬 영상입니다. 이 영상을 끝으로 Chapter03이 끝납니다. 시간적 여유가 있다면 예제를 함께 코딩해보고 자신만의 실험을 수행해보는 것도 좋겠습니다. 한 번에 이해하려 하지 마시고 시간을 가지고 천천히 공부하시기를 권합니다. 건투를 빕니다!

Komentáře • 68

  • @phewiekiwi3362
    @phewiekiwi3362 Před 2 lety +3

    이런 강의를 집에서 손쉽게 보다니 감사합니다!

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      좋은 평가 감사합니다. 도움이 되셨다면 널리 홍보도 부탁드려봅니다. ^^

  • @jemanpark7547
    @jemanpark7547 Před 2 lety

    친절한 수업 감사드립니다.

  • @user-eager
    @user-eager Před 2 lety

    감사합니다. 좋은자료 올려주셔서

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      좋은 평가로 이해해도 되지요? 단, 언어 선택은 신중해 주시기를 당부드립니다. 일단 수정을 부탁드립니다. 감사합니다. ^^

  • @user-lc7kh5xb8e
    @user-lc7kh5xb8e Před rokem

    아 정말 고맙습니다. 싱글 스레딩과 멀티 스레딩이 무슨 차인지 실제 코드로 보니까 정말 머리에 잘 들어 오네요 고맙습니다 ㅎㅎ

  • @user-sf8mp8qo7h
    @user-sf8mp8qo7h Před 2 lety

    스래드를 본걸로 만족 하겠습니다.
    감사합니다

  • @detk1874
    @detk1874 Před 2 lety

    와... 오늘도 알차게 알아가네요

  • @andodesjoke8742
    @andodesjoke8742 Před rokem

    최근 멀티스레딩 관련 과제를 하면서 sleep 함수를 여기저기 남발했다가 다시 구현해서 굉장히 와닿는 강의였습니다. 스레드 여러 개를 사용하니 작동 순서가 머리 속에 잘 그려지지도 않고 동기화도 어렵고 뮤텍스 락을 풀어주는 것도 까먹고... 멀티스레딩이 굉장히 어렵게 느껴졌습니다... 좋은 강의 감사합니다!

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před rokem +2

      좋은 평가와 피드백 감사합니다. 팁이랄 것도 없지만...일단 다 그려봐야 합니다. 그리고 정말 머리로 개발해야 합니다. 마치 시뮬레이션 하듯이 말이죠. 그리고 치명적인 오류를 경험하고 해결해보는 경험이 필요합니다. 시간이 좀 걸리죠. 그러니 조급하실 필요 없습니다. 누구나 다 겪는 과정이라 생각하시기를 권합니다. ^^

  • @fclass831
    @fclass831 Před 2 lety

    유틸들 좋네요. 오늘도 하나 배워가네요
    난 여태까지 힘들게 했구나 ㅋㅋ
    감사합니다!

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      Sysinternals 유틸리티 들은 정말 어마무시 합니다. 잘 활용해보세요. 좋은 평가와 피드백 감사합니다. ^^

  • @user-cx1gy1rk7x
    @user-cx1gy1rk7x Před 2 lety +2

    이 강의의 요지는 코드가 아닌 내용일텐데.. 요지를 벗어난, 먼저 이 길을 걸으신 선배님에 대한 리스펙 없는 피드백이 보이네요. 선생님께서 전하려하시는게 무엇인지는 잘 전달되고 있다고 생각합니다. 45분이 길줄알았더니 정말 순식간입니다! ㅎㅎ

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      좋은 평가와 피드백 감사합니다. 어떤 분들에게는 불필요하게 긴 설명일 수 있습니다. 결과적으로 도움이 된다면...그 정도 불편은 감수해줄 것으로 기대하고 있습니다. 그리고...다른 강의나 의견으로 욕을 많이 먹어서...요즘은 내성도 좀 생겼습니다. ^^;;;

  • @hm-xh1ju
    @hm-xh1ju Před rokem

    wait라는 것이 sleep이랑 완전히 다른거였군요. 잘 보고갑니다! 영상 감사합니다!

  • @user-nr9gz2rs7n
    @user-nr9gz2rs7n Před 3 měsíci

    잘 봤습니다!

  • @KongGPatG
    @KongGPatG Před 10 měsíci +1

    아 진짜 재밌게 봤어요 ㅋㅋㅋㅋㅋㅋ 스레드 순서 이상한거랑 0초동안 잠좀 잘게 이게 왤케 웃기지 ㅋㅋㅋㅋㅋㅋ

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 10 měsíci

      즐거우셨다면...대박입니다! 재미나게 공부 할 수 있으신 것 같아...보람차고 기쁩니다. 고맙습니다. :)

  • @marunarae550
    @marunarae550 Před 2 lety

    멀티쓰레딩도 배워보고 싶었었는데, 좋은 기회가 됐네요. 감사합니다. int 수준 단순대입은 그리고 동시접근이 안되는군요. 알아서 cpu가 락을 걸어주나봅니다.

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      네, 현재 일반적으로 사용하는 CPU 중에서 int 하나에 대한 원자성을 하드웨어 수준에서 보장하지 않는 프로세서는 없다고 보셔도 됩니다. 참고하시기 바랍니다. ^^

  • @inro4568
    @inro4568 Před rokem

    20220805 정말 감사합니다

  • @lainshower2298
    @lainshower2298 Před rokem

    안녕하세요! 질문이 생겨 댓글남깁니다!
    혹시 threadFunction03이 g_data의 값을 출력할 때 서로 다른 값이 출력되는 이유는 threadFunction01, threadFunction02, threadFunction03이 연산을 처리하는 도중에 context switching이 일어나서라고 이해하면 되는걸까요?

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před rokem

      네, 맞습니다.

    • @kkooru9458
      @kkooru9458 Před rokem

      @@nullnull_not_eq_null 오 이 부분은 생각해보지 못했네요! context switching은 threadFunction03에 sleep(0)했을 때 일어나는 건가요? Queue에서 빠져 나오지 않으면 (Sleep이나 Suspend상태) multi-threading에서 각 thread당 할당된 CPU core로 연산하면 개별적인 흐름이 프로그램이 끝날때 까지 switching되지 않아도 되는거 아닌가 생각했었어서요.. 아니면, threadFunction03이 g_data의 값을 읽게되면 입출력하던 공간에 원자성 보장되서 자동으로 suspend되고 context switching이 읽을때마다 01 또는 02 -> 03 -> 01또는 02 이런 식으로 나는건가요?

    • @kkooru9458
      @kkooru9458 Před rokem

      @@nullnull_not_eq_null 아니면, 시분할 방식 때문에, CPU를 mili-sec단위로 선점하고 시간 끝나고 CPU core반환하면 , 다른 thread연산의 흐름 진행되는 방식이라서 그런걸까요?..

  • @outstanding4330
    @outstanding4330 Před 2 lety

    안녕하세요 선생님 항상 강의 잘 듣고 있습니다. 썸네일에 표시된 운영체제교재 구매해놓고 아직 보진않았는데, 혹시 강의하시는 내용이 해당교재를 바탕으로 만들어진건가요??

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      네, 그렇습니다. 기본적인 구조와 흐름은 교재를 따라가고 거기에 제가 몇 가지 이야기를 더 올리는 방식이라고 보면 되겠습니다. 감사합니다.

  • @user-kk3lu6cu1u
    @user-kk3lu6cu1u Před 2 lety +3

    좋은강의감사합니다..
    "하드웨어 수준에서 int 32bit 단순 대입같은 오퍼레이션은 원자성을 보장합니다.(data가 섞일 가능성 없음)"라고 알려주셨는데, 그러면 double형 8byte같은 경우는 레이싱환경에서 원자성을 보장받지 못하는지 궁금합니다. Exe32bit, 64bit에 따라서 다를까요?

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      실수형에 대해서는 확인해본적이 없습니다. 따라서 정확히 말씀드릴 수가 없으나...지원할 것으로 생각합니다. 다만, 값을 정수 수준에서 1씩 증가하는 것은 어려울 것 같고 단순 대입이나 교환정도는 가능하지 않을까 추정해봅니다. 감사합니다. ^^

    • @user-kk3lu6cu1u
      @user-kk3lu6cu1u Před 2 lety

      @@nullnull_not_eq_null 혹시 블로그나 카페도 운영하시나요? 강의시 보여주셨던 소스도 text형태로라도 올려주시면 더욱더 효과적일것같아서 여쭙니다..

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      음...사용한 코드 등을 비롯해 몇몇 리소스는 멤버십 회원들에게만 공개하고 있습니다. 감사합니다. ^^

  • @kangminkim37
    @kangminkim37 Před 2 lety +1

    오늘도 좋은 강의 감사합니다.
    혹시 MacOS에서 process explorer와 비슷한 기능을 하는 프로그램도 있을까요?

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety +1

      있긴 있는 것으로 알고 있습니다만 자세한 정보는 없고 윈도우 작업 관리자 수준 정보만 표시되는 것 같습니다.

    • @user-zo3ps4cw7i
      @user-zo3ps4cw7i Před 2 lety +1

      Activity monitor가 task manager 정도 정보를 보여줍니다.

    • @kangminkim37
      @kangminkim37 Před 2 lety

      @@user-zo3ps4cw7i 감사합니다ㅎㅎ

  • @sangminkim9514
    @sangminkim9514 Před 2 lety

    유익한 강의 너무 감사드립니다!
    혹시 JVM에서 사용하는 user thread(green thread)와 kernel thread(native thread)의 차이는 어떤것이고 관계는 어떻게 되는지 궁금합니다 (user kernel) thread의 관계는 many to one, one to one, many to many가 있다고하는데 유즈케이스가 떠오르지않아서 어렵네요

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      언급하신 부분은 매우 개념적인 내용이고 내부 구조에 관한 것이라 표면적으로 드러나지 않습니다. 직접 가상 머신을 설계하거나 그에 준하는 시스템 소프트웨어를 개발할 일이 없다면 실질적인 경험을 해볼 수가 없습니다. 아쉽지만 개념으로만 이해하시기를 권합니다.

    • @SWann_P
      @SWann_P Před 2 lety +1

      만약 개념적인 이해가 부족한 상황에서 실습을 통해 공부해보고 싶으시다면 pintOS 1번을 짜보는 것도 좋을 것 같습니다.

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      @@SWann_P 좋은 댓글 감사합니다. ^^

  • @user-xw4qq6or6q
    @user-xw4qq6or6q Před rokem

    감사합니당 ㅋ

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před rokem

      저도 감사합니다

    • @user-xw4qq6or6q
      @user-xw4qq6or6q Před rokem

      @@nullnull_not_eq_null 20대 중반에 개발 시작해서 30대 중반이 되었는데, 공부를 안하다가 이제야 공부를 시작했는데, 개발자님 강의 잘 듣고 있습니다. 항상 새벽에 일어나서 개발자님 강의 2개 듣고 공부 시작합니다. 운영체제는 대학때 들었지 현업에서는 크게 신경쓰지 않았는데, 운영체제를 다시 보니, 코딩을 할때 좀더 신경쓰게 되는거 같습니다. 쉽게 알려주셔서 이해가 정말 잘됩니다. 감사합니다 ^^

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před rokem

      피드백 감사합니다. 열공하고 계시나 봅니다. 꼭 좋은 결과로 이어지기를 응원하겠습니다. ^^

  • @sjjo5342
    @sjjo5342 Před 2 lety

    저는 C#으로 비슷한 예제를 작성한 적이 있는데요, C#은 멀티쓰레딩 편하게 구현할 수 있도록 해두었더라구요. 그래서 성능이 필요한 부분은 C나 C++로 작성하고, 멀티쓰레딩 부분은 C#으로 구현하면 좋지 않을까 생각하는데.. 요새 multi language 프로그램이라고 여러 언어를 섞어 프로그램 하는게 있는데 그건 어떻게 생각하시나요? 마이컴은 실시간 처리 때문에 C와 어샘블리를 혼용하여 작성하기도 합니다 ㅎㅎ

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety

      소위 폴리글랏은...이제 정말 대세가 된 것 같습니다. 가장 좋은 것들을 모아 극단적인 효율을 얻는 것이죠. 저도 그것이 맞다고 생각하고 있습니다. 좋은 의견 감사합니다. ^^

  • @yc7260
    @yc7260 Před 4 měsíci

    HW가 단순 데이터에 대한 레이싱 컨디션에서 원자성을 보장한다고 하였는데요.
    이 원자성이란 성질을 데이터베이스 공부할때 들어본 용어인데 그 뜻을 풀어보면 여러 스레드의 요청이 모두 받아들여져 전역 변수가 1000, 2000, 1000 이런식으로 바뀌는 것인가요? 즉, 모든 작업이 CPU에 의해 연산되고 메모리상의 데이터는 1000이거나 2000이거나 그것이 원자성이 의미하는 바인지 궁금합니다.

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 4 měsíci

      음...쉽게 생각해 A라는 스레드가 특정 레지스터의 값을 변경하는 동안 B가 같은 레지스터의 값을 동시에 변경하는 것이 H/W 수준에서 불가능하다는 것으로 보시면 되겠습니다. 참고하시기 바랍니다. :)

  • @jung339
    @jung339 Před rokem

    널널님 자바로 스레드 연습해봤는데,
    콘솔에 찍힌 출력값을 보면 main함수가 다 끝나도 스레드로 만들어놓은 함수안의 내용이 출력되어서 나오는데 이건 왜 이런걸까요??
    참고로 sleep함수는 안멕였습니다
    영상에서 "스레드들이 cpu자원을 할당받기도 전에 프로세스가 종료되어서 ~~"라고 하셔서 의문이 생겼습니다

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před rokem

      JAVA는 일반 CPU가 아니라 JVM에서 작동합니다. 따라서 일반 시스템의 스레드는 네이티브 스레드로 별도로 분리하고 JVM 스레드가 따로 존재합니다. 아마도 그 때문이 아닐까 싶습니다. 참고하시기 바랍니다.

  • @jongjinlee_
    @jongjinlee_ Před rokem

    37:10 Set가 던진다? 뭘 던진다는 건지.. 뭘 받는다는 건지...ㅠㅠ 아무것도 이해 못하겠어요!! 뒤로 갈수록 넘 어렵군요ㅎㅎㅎㅎ

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před rokem +1

      음...일단은 개념적으로만 이해하기 바랍니다. 구체적인 코드를 봐야 더 자세한 이야기가 가능하지요. 지금은 개념적으로 '깃발'이 올린 것인지 아니면 내린 것인지 그 둘을 단순 검사하는 정도로 이해하면 됩니다. Set은 깃발 올림, Reset은 깃발 내림 정도로요.

  • @frogkim2933
    @frogkim2933 Před 2 lety

    Sleep 을 어떻게 쓰냐에 따라 그 개발자의 내공을 알 수 있다....
    하...그죠... 동기화 처리 못 해서 프로그램 프리징 되는데 슬립 덕지덕지 붙여서 수습해 가고 있는 모습을 봤더니...

  • @lasercho4338
    @lasercho4338 Před 2 lety +1

    20:29 시원하신가요?

  • @user-ez4km2eb3j
    @user-ez4km2eb3j Před 2 lety

    참 좋은 내용 감사합니다...만 왜 beginThread같은 함수를 쓰시는지 대충 이해는 가지만 이제는 너무 올드하지 않나...싶습니다 모던에서 좀더 쉽게 만들어준 std::thread 함수들을 사용해도 좋지 않을까 싶네요

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před 2 lety +3

      잠깐 고민하다가...일단 지금은 개념설명만 할 생각이라...그리했습니다. ^^
      제가 좀 올드한 부분이 있지요. 관련해서 강의는 따로 만들도록 하겠습니다. C++11 원자성 + 스레딩 관련한 내용들은 따로 분류하는 것도 좋겠다 생각하고 있습니다. 의견 감사합니다.

  • @ryanlee5435
    @ryanlee5435 Před 2 lety

    1빠

  • @PaycoinKorea
    @PaycoinKorea Před měsícem

    연산의 단위는 Process 아닌가요? 아래 강의에서 OS가 관리해야 하는 연산의 단위는 Process이고, Thread는 연산(Process)에 있는 한 개의 흐름이라고 이해했었거든요
    czcams.com/video/x-Lp-h_pf9Q/video.html

    • @nullnull_not_eq_null
      @nullnull_not_eq_null  Před měsícem

      사실 그게 OS마다 차이가 있습니다. Linux에서는 Process고 윈도우에서는 Thread라 하는 것이 정확하겠습니다. 윈도우 환경에서 모든 프로세스는 1개 이상의 스레드를 갖습니다. 참고하시기 바랍니다. :)

    • @PaycoinKorea
      @PaycoinKorea Před měsícem

      @@nullnull_not_eq_null 답변 감사합니다

    • @PaycoinKorea
      @PaycoinKorea Před měsícem

      @@nullnull_not_eq_null 영상을 다 봤는데, 여전히 동기와 비동기의 차이가 잘 와닿지 않습니다 ㅠㅠ Process와 Thread의 차이(czcams.com/video/x-Lp-h_pf9Q/video.html)에 대해 설명해주신 영상처럼 동기와 비동기에 대해 자세히 설명해주신 영상이 따로 있을까요? 유튜브 채널 검색 시스템을 이용해서 찾아봐도 안 보여서요😢😢