alones.kr/blog로 사이트 이전했습니다. 관련 공지

Alones world : Location : Tag : GuestBooks : Admin : New Article : Alones Wiki : Joinc TeamBlog
Alones world 블로그에 오신것을 환영해요^^
gidaeyeo@gmail.com
175
238
353112

Add to Google Reader or Homepage

 Subscribe in a reader

현재 접속 자 수
hit counters
------------
Recently Popular Posts
------------
'c/c++'에 해당되는 글 10건


 wiki: 크리티컬섹션, 뮤텍스, 세마포어의 차이

  • initial version: 2007.08.12

목차

1 Richter 책에 있는 표
2 크리티컬섹션 (Critical section)
3 뮤텍스 (Mutext)
4 세마포어 (Semaphore)


 

  • [http] 계속 쭈~욱 가는거야님이 크리티컬섹션, 뮤텍스, 세마포어의 차이에 대해서 간단히 잘 정리해주셔서 그 내용을 포스팅합니다.



1 Richter 책에 있는 표 #


Object When Nonsignaled When Signaled Successful Wait Side Effect
Semaphore Successful wait         When count>0
    (ReleaseSemaphore)
Decrements count by 1
Mutex Successful wait When unowned by a thread
(ReleaseMutex)
Gives ownership to thread
Critical Successful wait
(EnterCriticalSection)
When unowned by a thread
(LeaveCriticalSection)
Gives ownership to thread

2 크리티컬섹션 (Critical section) #

유저모드 동기화 객체
커널모드 객체가 아니기 때문에 가볍고 같은 프로세스내에 스레드 동기화에 사용할 수 있다.
EnterCriticalSection을 호출하면 객체는 비신호 상태가 되고,
LeaveCriticalSection을 호출하면 신호상태로 바뀌어서 다른 스레드들이 접근가능하다.

3 뮤텍스 (Mutex) #

커널모드 동기화 객체
커널모드라서 크리티컬 섹션보다는 느리지만 프로세스를 넘어서 모든 스레드에 사용 될 수 있는 동기화 객체이다.
뮤텍스를 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면 뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.
ReleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 다른 스레드들이 접근가능하다.

4 세마포어 (Semaphore) #

커널모드 동기화 객체
뮤텍스와 비슷하지만 접근할 수 있는 스레드 갯수를 정할 수 있다.
세마포어를 생성할 때 3개의 스레드들이 접근가능하도록 지정하면 내부카운트값은 3이다.
객체 내부적으로 카운트를 관리하여 세마포어 객체를 Wait하는 스레드가 있으면 카운트가 하나씩 감소한다. 그래서 내부카운트가 0이되면 비신호상태로 바뀐다. [[br] 세마포어를 사용하고 있는 스레드들중 ReleaseSemaphore 하면 세마포어 내부카운트는 다시 1 증가하여 신호상태로 바뀌어서 다른 스레드들이 사용가능하게 된다.

※ 세마포어 생성 시 접근 가능한 스레드를 0으로 설정해서 WaitforSingleObject와 같은 효과를 내어서 사용하기도 하죠.
크리에이티브 커먼즈 라이센스
Creative Commons License
Trackback 0 : Comment 11
http://alones.byus.net/tt/trackback/738
From. BlogIcon 정의의소 2007/08/13 00:28Delete / ModifyReply
google reader가 왜 동작 안 하지? ㅡㅡ;
어쩐지 글이 안 올라오더라..쩝..
BlogIcon alones 2007/08/13 01:47Delete / Modify
alones.byus.net/tt/rss로 읽고 있으세요? 흠..
FeedBurner로 읽으면 될 것 같기도 하고.. 아훔... 요즘 말썽이네요.. 다 사이트맵 오류 때문인 거 같은데 ㅜ.ㅜ 다른데로 옮겨야 할 듯..
BlogIcon yundream 2007/08/13 09:30Delete / Modify
혹시 RSS 갱신이 제대로 안되는 문제 아닌가요 ?
제 tt도 그런 문제가 있어서, 글 포스팅 한다음 수동으로 rss 생성한다는 -.-;
BlogIcon 정의의소 2007/08/13 11:46Delete / Modify
네.. 갱신이 안 되는 문제 입니다.

쩝.. tt의 문제였구나...

From. BlogIcon kiss prince 2008/05/23 04:38Delete / ModifyReply
우수한 위치! 많은 감사.
From. BlogIcon sweet asian teen 2008/05/23 05:06Delete / ModifyReply
나는 배웠다 매우…
From. BlogIcon transvestite drawings 2008/05/23 05:39Delete / ModifyReply
걸출한 뉴스!! 종류 블로그!
From. BlogIcon crossdressed couples 2008/05/24 00:08Delete / ModifyReply
걸출한 위치! 많은 감사.
From. BlogIcon fur tits 2008/05/24 00:17Delete / ModifyReply
친구는 너의 현재 위치의 팬이 되었다!
From. BlogIcon new york breast surgery 2008/05/24 02:10Delete / ModifyReply
정보를 위한 감사합니다.
From. BlogIcon black vomit 2008/05/24 03:35Delete / ModifyReply
나의 너의 친구는 위치의 현재 팬이 되었다!

최시 내용은 아래 위키에서 볼 수 있다.
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)

크리에이티브 커먼즈 라이센스
Creative Commons License
Trackback 0 : Comment 13
http://alones.byus.net/tt/trackback/733
From. BlogIcon amateur audra busty mitchell 2008/03/13 06:11Delete / ModifyReply
우수한 일! 감사!
From. BlogIcon sexy lesbian lick 2008/03/13 07:03Delete / ModifyReply
너는 아름다운 웹사이트가 있는다!
From. BlogIcon adware alert spyware 2008/03/13 07:46Delete / ModifyReply
이 위치는 유익한뿐 아니라 재미있는다!
From. BlogIcon voyeur pictures 2008/03/13 08:33Delete / ModifyReply
좋은 위치! 너를 감사하십시요.
From. BlogIcon zoloft and sex 2008/03/14 03:30Delete / ModifyReply
중대하고 유용한 위치!
From. BlogIcon lesbian latino 2008/03/14 04:24Delete / ModifyReply
좋은 위치는 그것 찾아본 즐겼다!
From. BlogIcon alana als scan 2008/03/14 05:12Delete / ModifyReply
나의 친구는 너의 위치의 현재 팬이 되었다!
From. BlogIcon interracial milfs 2008/05/23 04:18Delete / ModifyReply
너는 아름다운 웹사이트가 있는다!
From. BlogIcon transexuals transgenders crossdressers 2008/05/23 04:42Delete / ModifyReply
위치에 그것을 중대한 일은 좋아했다!
From. BlogIcon blood clot medication 2008/05/23 05:20Delete / ModifyReply
나는 합의한다 너에 이다. 그것은 이렇게 이다.
From. BlogIcon girl s town 2008/05/24 00:38Delete / ModifyReply
정말 같지 않는 블로그!
From. BlogIcon full body sensual massage utah 2008/05/24 00:40Delete / ModifyReply
친구는 너의 현재 위치의 팬이 되었다!
From. BlogIcon davidson harley truck used 2008/05/24 03:39Delete / ModifyReply
우수한과 아주 도움이 되는!

실수 하기 쉬운 코드에 대해서 생각나는 대로 다뤄보려고 한다.

당연한 것이지만 너무 당연해서 찾기 힘든 코드나 경험하지 않으면 찾기 힘든 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 )
{