|
뭔가 혼동하시는것 같은데..
동기화 객체는 기본적으로 멀티쓰레드(갯수 상관없음)가 접근하는걸 제어하기위한 객체입니다.
뮤텍스, 크리티컬 섹션은 오직 한개의 쓰레드만 접근 가능하게 하는 구조이고
세마포어는 동시 접근 할 수있는 쓰레스 개수를 지정할 수 있는 개념이고요
세마포어 개수를 1로 설정하면 뮤텍스와 동작이 같습니다.
님이 제시한 소스코드는 뮤텍스 세마포어의 논의 하기에는 의미가 없습니다.
질문 님이 쓰신 글 :
: 님은 크레브 님과 의견이 다른신거죠??
:
: 크레브 님은 세마포어는 단지 여러 쓰레드가 접근 해도 되는 리소스를 사용할때
: 몇개까지 접근할 수 있도록 단지 동기화 처리를 해주는 것이지
: 그게 3개가지 동시에 접근해도 문제가 안되게 하는 구조라고 설명해주셨는데 그말은 임계구역에 스레드 동시
: 접근이 안되다는 뜻 아닌가요??
:
: 그런 Lyn님은
:
: 애초에 Thread 생성갯수와는 전혀 관계 없습니다.
: 동시에 몇개가 임계영역 안으로 들어올 수 있느냐의 문제지라고 적어주셨는데 그 말은 제가 처음에 올린것 처럼
: 임계구역안으로 스레드가 동시에들어올 수 있다는 말씀 이신거죠??
:
: 저 그렇다면 예를 들어 3개까지 동시 접속을 허용했을 경우
: A, B, C라는 스레드가 있다고 가정했을 때 A라는 스레드가 ①부터 시작해서 ②을 수행중이라고 가정했을 때 B라는 스레드가
: 동시에 ①부터 다시 수행할 수있다는 건가요??
:
: 근데 그렇게 되면 A라는 스레드가 ② 코드를 수행하여 i의 값을 1로 증가 시켰는데 다시 B라는 스레드가 ①의 기능을 수행한다면
: i값을 0으로 만든다면 A스레드가 i값을 사용하는데 영향을 받지않게되나요??
:
: 세마포어의 구동 원리가 궁금합니다..ㅠㅜ
:
:
:
:
:
: Lyn 님이 쓰신 글 :
: : 애초에 Thread 생성갯수와는 전혀 관계 없습니다.
: :
: : 동시에 몇개가 임계영역 안으로 들어올 수 있느냐의 문제지
: : 질문 님이 쓰신 글 :
: : : 제가 위에 질문중에 3번 답변달아주신 것중에 궁금한게 있어서 다시 질문 올립니다...
: : :
: : : 3번질문에 아래와 같이 답 달아주셨는데요
: : :
: : : 위와 같은 코드는 어차피 로컬변수(int i) 이므로 동기화 없이 아무리 쓰레드를 많이 돌려도 쫑날 일은 없습니다.
: : : : ( printf가 문제가 될 가능성은 좀 있어보입니다. )
: : : :
: : : : global 변수나 객체, 리소스를 여러쓰레드에서 동시에 접근할때 사용하라고 만든게
: : : : 동기화 객체들 입니다. 그런 용도로 쓰시면 됩니다.
: : : :
: : : : 세마포어는 단지 여러 쓰레드가 접근 해도 되는 리소스를 사용할때
: : : : 몇개까지 접근할 수 있도록 단지 동기화 처리를 해주는 것이지
: : : : 그게 3개가지 동시에 접근해도 문제가 안되게 하는 구조를 만드는 것은
: : : : 개발자 본인의 책임입니다.
: : : : 동시 접근할때 문제가 되게 만들어 놓고 세마포어를 쓰는것은 세마포어의 용도를 모르고 썼다는 얘기밖에 안됩니다.
: : :
: : : 실제 세마포어 쓸때는 전역 변수를 쓸겁니다..예제는 단순히 그냥 든거구요
: : : 근데
: : :
: : : 세마포어는 단지 여러 쓰레드가 접근 해도 되는 리소스를 사용할때
: : : 몇개까지 접근할 수 있도록 단지 동기화 처리를 해주는 것이지
: : :
: : : 요 부분이요...
: : : 뮤텍스도 여러개의 스레드를 만들어서 크리티컬 섹션 영역에 동기화해서 접근할 수있잖아요...
: : : 그러면 뮤텍스와 세마포어의 차이가 뭔가요???
: : :
: : : 세마포어는 스레드 접근 개수를 설정할 수 있다고 해서 전 동시에 접근 가능한 스레드의 수를 설정하는거라 생각했는데요
: : : 그럼 세마포어가 설정한 스레드의 개수는 혹시 무한데로 스레드가 접근할까봐 그걸 막기위해 스레드 수를 제한한건가요??
: : :
: : : 뮤텍스를 스레드 생성을 무한데로 만들고 싶은 만큼 만들 수 있는거고 세마포어는 최대 접근 가능한 스레드수를 제한해서
: : : 무한데로 스레드가 접근하는걸 막기위해 사용하는 건가요??
: : :
: : :
: : :
: : :
: : :
: : :
: : :
: : :
: : :
: : : 크레브 님이 쓰신 글 :
: : : : 질문 님이 쓰신 글 :
: : : : : 1. 뮤텍스 또는 세마포어의 매개변수 리스트 중 보안속성에 관한 것이있는데 이 보안속성이라는 것이
: : : : : 무엇인지..인터넷이나 책에서는 그냥 NULL값을 쓰라고 되어 있는데 좀 더 자세히 알고 싶습니다..
: : : :
: : : : 자세히 보지 않아서 모르겠습니다.
: : : :
: : : :
: : : :
: : : : : 2. 크리티컬 섹션은 하나의 동일한 프로세스내의 여러 스레드를 관리할 때 사용하고 뮤텍스는 다른 프로
: : : : : 세스내의 스레드도 관리 할 수 있다고 하는데 프로세스가 하나의 프로그램단위로 알고 있는데 그렇다면
: : : : : 우리가 exe 실행 파일을 만든다면 두 개의 exe 파일끼리 주고 받는 것을 말하는 건가요??
: : : :
: : : : 맞습니다.
: : : : :
: : : : :
: : : : : 3. 세마 포어에 대해 문의드립니다...
: : : : : 예를 들어 공통으로 사용되는 코드 내용이
: : : : :
: : : : : int i = 0; ........... ①
: : : : : i++; ............... ②
: : : : : printf("%d", i); ...... ③
: : : : :
: : : : : 이런게 있다면..크리티컬 섹션이나 뮤텍스의 경우 예를 들어 A와 B라는 스레드가 있을 경우 A스레드가 ① ~ ③까지 수행하기 전까지 B 스레드는 접근하지 못하고 대기하고 있다고 A스레드가 ① ~ ③까지의 작업을 완료하면 그때서 B스레드가 다시 ① ~ ③까지 수행하는 거잖아요(위 아래로 lock, unlock 있다고 가정하에)
: : : : :
: : : : : 근데 세마포어는 동시에 여러개의 스레드가 접근할 수 있다고 하는데...예를 들어 3개까지 동시 접속을 허용했을 경우
: : : : : A, B, C라는 스레드가 있다고 가정했을 때 A라는 스레드가 ①부터 시작해서 ②을 수행중이라고 가정했을 때 B라는 스레드가 동시에 ①부터 다시 수행할 수있다는 건가요??
: : : : :
: : : : : 근데 그렇게 되면 A라는 스레드가 ② 코드를 수행하여 i의 값을 1로 증가 시켰는데 다시 B라는 스레드가 ①의 기능을 수행한다면 i값을 0으로 만든다면 A스레드가 i값을 사용하는데 영향을 받지않게되나요??
: : : : :
: : : :
: : : : 위와 같은 코드는 어차피 로컬변수(int i) 이므로 동기화 없이 아무리 쓰레드를 많이 돌려도 쫑날 일은 없습니다.
: : : : ( printf가 문제가 될 가능성은 좀 있어보입니다. )
: : : :
: : : : global 변수나 객체, 리소스를 여러쓰레드에서 동시에 접근할때 사용하라고 만든게
: : : : 동기화 객체들 입니다. 그런 용도로 쓰시면 됩니다.
: : : :
: : : : 세마포어는 단지 여러 쓰레드가 접근 해도 되는 리소스를 사용할때
: : : : 몇개까지 접근할 수 있도록 단지 동기화 처리를 해주는 것이지
: : : : 그게 3개가지 동시에 접근해도 문제가 안되게 하는 구조를 만드는 것은
: : : : 개발자 본인의 책임입니다.
: : : : 동시 접근할때 문제가 되게 만들어 놓고 세마포어를 쓰는것은 세마포어의 용도를 모르고 썼다는 얘기밖에 안됩니다.
: : : :
: : : :
: : : :
: : : :
: : : :
: : : :
: : : : : 세마포어는 각각 스레드 마다 값을 저장하는 장소(?)가 따로따로 주어주는 건가요?? 그래서 A스레드는 A스레드데로 값을 저장하고.. B스레는 B스레드 데로 값을 저장하고...C스레드는 C스레드데로 값을 저장하고 그런 형태인건가요??
: : : : :
: : : : : 그렇다면 각각의 스레드가 자신들의 값은 스택에 저장해 놓는건가요?? 메모리에 별도의 공간이 생기는건가요??
: : : : :
: : : : : 세마포어 실행 방식에 대해 설명 부탁드립니다 인터넷이나 책은 그냥 여러개의 스레드가 사용할 수 있도록 허용하는 것이다 라고만 나와있고 그 데이터 처리를 어떻게 하는지에 대한 부분이 없어서요.///
|