wiki: 크리티컬섹션, 뮤텍스, 세마포어의 차이
initial version: 2007.08.12
목차
1 Richter 책에 있는 표
2 크리티컬섹션 (Critical section)
3 뮤텍스 (Mutext)
4 세마포어 (Semaphore)
계속 쭈~욱 가는거야님 이 크리티컬섹션, 뮤텍스, 세마포어의 차이에 대해서 간단히 잘 정리해주셔서 그 내용을 포스팅합니다.
1 Richter 책에 있는 표 #
Object
When Nonsignaled
When Signaled
Successful Wait Side Effect
Semaphore
Successful wait
When count>0 (R eleaseSemaphore)
Decrements count by 1
Mutex
Successful wait
When unowned by a thread (R eleaseMutex)
Gives ownership to thread
Critical
Successful wait (E nterCriticalSection)
When unowned by a thread (L eaveCriticalSection)
Gives ownership to thread
2 크리티컬섹션 (Critical section) #
유저모드 동기화 객체 커널모드 객체가 아니기 때문에 가볍고 같은 프로세스내에 스레드 동기화에 사용할 수 있다. E nterCriticalSection을 호출하면 객체는 비신호 상태가 되고,
L eaveCriticalSection을 호출하면 신호상태로 바뀌어서 다른 스레드들이 접근가능하다.
3 뮤텍스 (Mutex) #
커널모드 동기화 객체 커널모드라서 크리티컬 섹션보다는 느리지만
프로세스를 넘어서 모든 스레드에 사용 될 수 있는 동기화 객체이다.
뮤텍스를 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면 뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.
R eleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 다른 스레드들이 접근가능하다.
4 세마포어 (Semaphore) #
커널모드 동기화 객체 뮤텍스와 비슷하지만 접근할 수 있는 스레드 갯수를 정할 수 있다. 세마포어를 생성할 때 3개의 스레드들이 접근가능하도록 지정하면 내부카운트값은 3이다.
객체 내부적으로 카운트를 관리하여 세마포어 객체를 Wait하는 스레드가 있으면 카운트가 하나씩 감소한다. 그래서 내부카운트가 0이되면 비신호상태로 바뀐다. [[br] 세마포어를 사용하고 있는 스레드들중
R eleaseSemaphore 하면 세마포어 내부카운트는 다시 1 증가하여 신호상태로 바뀌어서 다른 스레드들이 사용가능하게 된다.
※ 세마포어 생성 시 접근 가능한 스레드를 0으로 설정해서
W aitforSingleObject와 같은 효과를 내어서 사용하기도 하죠.
크리에이티브 커먼즈 라이센스
c/c++ ,
critical section ,
mutex ,
semaphore ,
system programming ,
Windows Programming ,
뮤텍스 ,
세마포어 ,
시스템 프로그래밍 ,
차이 ,
크리티컬 섹션
http://alones.byus.net/tt/trackback/738
최시 내용은 아래 위키에서 볼 수 있다.
in my wiki initial version: 2007.08.06
목차
1 정상적으로 open했는데 write 시 무엇이 문제인가 2 무리한 open()과 open() 체크
1 정상적으로 open했는데 write 시 무엇이 문제인가 #
아래 코드를 얼핏 보면 파일이 정상적이고 open()이 제대로 되었는데 write()가 '-1'을 리턴해버린다.
도대체 무엇이 문제란 말인가?
#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <io.h> #include <stdio.h> #include <string.h> #include <errno.h>
#define BUFF_SIZE 256
void main(){ int nErr; int nRetWrite; int fh1; char buff[BUFF_SIZE]; sprintf(buff, "test contents" );
// open file and check fd if (fh1 = open( "OPEN.OUT" , _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE ) < 0 ) { perror( "Open failed on output file" ); }
// write nRetWrite = write(fh1, buff, strlen(buff)); if ( nRetWrite == -1 ) { nErr = errno;
//EBADF Bad file number 9 if (nErr == EBADF ) { perror("write fail" ); } }
// close file close( fh1 ); }
//
실행 해보면 에러 메시지는 아래와 같다.
write fail: Bad file descriptor
2 무리한 open()과 open() 체크 #
문제는 open()과 동시에 open() 결과에 대한 error 체크를 할 때, 코드를 잘 못 써버린 것이다.
문제의 코드는 아래이다.
의도는 open()을 하고 open() 시 리턴되는 file handle이 음수인지 체크하려는 것인데 연산자 우선 순위 를 간과해서 문제가 발생한 것이다.
// open file and check fd if (fh1 = open( "OPEN.OUT" , _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE ) < 0 )
//
open()의 리턴 값이 file handle을 fh1에 담고 그 것이 음수 인지 (<0) 비교하려고 했지만
실제로는 부등호가 대입 연산자 보다 우선순위가 높아서 open()에서 리턴된 file handle이 음수인지 먼저 비교되고 그
결과가 fh1에 대입된 것이다.
정상적인 파일이기 때문에 open()의 결과인 file handle은 양수가 되고 이 것이 음수와 비교 되니 비교 결과는 false (-1)가 되어 fh1에 대입된 것이다.
아래와 같이 코드를 수정 할 것이다.
// open file and check fd if ( (fh1 = open( "OPEN.OUT" , _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE ) ) < 0 )
크리에이티브 커먼즈 라이센스
http://alones.byus.net/tt/trackback/733
실수 하기 쉬운 코드에 대해서 생각나는 대로 다뤄보려고 한다.
당연한 것이지만 너무 당연해서 찾기 힘든 코드나 경험하지 않으면 찾기 힘든 error 대처 법 이나 bug에 대해서 다뤄 보려고 한다.
시간에 쫓기다 보면 또는 머릿 속이 가끔 정전이 될 경우 사람을 미치게 만드는 (자기가 세상에서 제일 바보 처럼 느껴지게 하는) 코드에 대해서 다룰 예정이다.
첫 번째는 다음과 같다.
최신 내용은 아래 wiki에서 볼 수 있다.
in my wiki:
http://alones.byus.net/moniwiki/wiki.php/mistakable_code_open_write_read initial version: 2007.08.02
목차
1 open()을 했는데 왜 read()가 안될까? 2 file을 write 모드로 열었기 때문이다
1 open()을 했는데 왜 read()가 안될까? #
아래 코드를 보자 왜 read()가 안될까?
#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <io.h> #include <stdio.h>
#include <errno.h>
#define BUFF_SIZE 256
void main(){ int fh1;
// open file fh1 = open( "OPEN.OUT" , _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE );
// check file handle if ( fh1 == -1 ) {