여러 스레드가 하나의 함수를 동시에 사용하려 들때, 과연 함수는 동시에 실행될 수 있나요 ?
글쓴이: dingkyu / 작성시간: 금, 2011/04/01 - 3:48오후
최근 멀티스레드로 프로그램을 작성하다가 문뜩 궁금한 사실이 생겨서 질문글 작성합니다.
간단히 제가 궁금해하는 사항을 설명하면 다음과 같습니다.
A 라는 콜백함수 형태의 함수가 있습니다.
그리고 2개 이상의 스레드가 실행하면서 A라는 콜백함수를 호출하게 됩니다.
시스템이 듀얼코어 이상이라, 2개의 쓰레드가 동시에 수행이 가능하다고 할때, 이 A라는 콜백함수 역시 동시에 수행이 가능한가요 ? 즉 동시에 2개 이상의 스레드에 의해 호출이 가능하고 그 기능역시 수행이 가능한건지 궁금합니다.
만약 안된다면, 2개의 스레드중, 하나의 스레드가 먼저 A 함수를 호출해서 함수내용을 수행하고 그 다음 스레드가 A함수를 호출해서 함수내용을 수행하게 되는것인지, 궁금하네요.
참고할 수 있도록 도움 부탁드리겠습니다.
Forums:
작성중이라면 직접 해보세요. A함수 내에서 지역변수만
작성중이라면 직접 해보세요. A함수 내에서 지역변수만 쓰는 이상 쓰레드마다 각기 다른 스텍으로 돌아갈텐데 아무 상관없습니다.
정말 몰라서 여쭤봅니다.
그러면 하나의 함수가 어느 쓰레드에 의해서 사용중이다 라는것을 어떻게 확인할 수 있나요 ?
틀림없이 어떤 방법이 있을꺼 같은데 그 방법을 모르겠습니다. 어떤 키워드로 검색을 해야 하는지도 감이 잘 안오구요.
괜찮으시면 개략적인 설명이나 바쁘시다면 검색의 키워드 정도만이라도 가르켜주시면 감사하겠습니다.
고민이 많아 고민인 애늙은이 입니다.
제가 지금 그런 방식으로 프로그램을 짜고 있습니다.
문제 없이 잘 돌아 갑니다.
물론 제가 했던 방식은
Session이라는 Struct에 callback 함수를 넣고
각 thread에 사용되는 Session에 각각의 Callback을 초기화/등록 시켜줬다는 전제 입니다.
쓰고보니..
제 답이 틀린 방향으로 가는거 같군요....
듀얼코어에서 동시 수행이라는 전제에 대해서는.....
잘 모르겠네요 그래도 혹시 다른 분들에게 도움이 될지 모르니
리플 스택은 유지해 놓도록 하겠습니다.
그렇게 수행 가능합니다
그렇게 수행 가능합니다
실제로 그렇게 동작되게 하기 위해 나온 개념이 스레드입니다
어떤 문제가 있을까요?
코드는 코드 영역에 있는 읽기전용이니 동시에 수행되어도 당연히 문제 없을 테고
함수 내에 있는 지역변수들에게 동시에 접근하는 동기화 문제를 있을 거 같지만
그 지역변수들은 서로 다른 메모리 영역에 저장되어 있습니다
이름만 같은 서로 다른 변수가 됩니다
단, 함수 내에서 전역변수나 static 변수는 같은 메모리 영역에 저장되어 있습니다
변경하는 경우 동기화 문제가 생깁니다
따라서 mutex 등으로 동기화 문제가 발생하지 않게 작성하셔야 합니다
답변 감사드립니다.
저도 제가 알고 있기로는 함수 자체는 하나의 명령어 셋이 되어 메모리의 일정 부분을 차지하고 있어서, 단순히 그냥 읽어 내려가면서 그 명령어 셋을 실행하면 되는것으로 이해를 하고 있었습니다만, 이게 그냥 막연히 알고 있었던 부분이라서요..
당연히 데이터로의 접근은 뮤텍스나 크리티컬섹션 등을 통해 동기화를 시켜야 한다고는 알고 있었습니다만, 함수 자체도 그렇게 실행되는것이 맞는가 라는게 아리송 해서요..
답변 감사드립니다.
고민이 많아 고민인 애늙은이 입니다.
reentrant와 thread-safe의 차이에
reentrant와 thread-safe의 차이에 대해 알아보시는 것도 도움이 될듯합니다.
답변 감사드립니다.
알려주신 키워드에 대해 공부해 보도록 하겠습니다.
감사합니다.
고민이 많아 고민인 애늙은이 입니다.
댓글 달기