ASYNC-SIGNAL SAFETY
The mutex functions are not async-signal safe. What this means is that
they should not be called from a signal handler. In particular, calling
pthread_mutex_lock or pthread_mutex_unlock from a signal handler may
deadlock the calling thread.
근데.....
뜻하는 봐가...... 신호를 받아도 그대로 블럭된다는 말로 봤는데 맞는건지 --;
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
제가 알기로는 pthread_mutex_lock() 이 signal이 발생한다고 해서 return이 되지는 않습니다.
mutex lock을 획득하려고 wait상태에 있는 상황에서도 signal이 발생할수 있고, 그런 상태에서 signal이 발생한다면 signal handler 함수가 호출되므로(물론 signal()이나 sigaction으로 등록시킨 경우에..) signal handler 함수 내부에서 mutex lock을 획득하려는 시도는 dead lock을 야기시킬 수 있다는 것 뿐이죠.
아시겠지만 말씀하신 ASYNC-SIGNAL 은 signal을 발생시킨 context가 자신이 아니라 다른 context- 다른 thread나 혹은 shell에서 의도적으로 signal을 주는 경우- 에서 발생시킨 signal이란 의미죠.
[여기서 중요한게 타이머값이 INFTIM일 경우 poll 함수의 타이머값이 무한데로
설정되는데 있습니다 그런데 mypoll 다른 쓰레드에서도 mypoll.Add 해줄수 있기때문에 Add 해준 클라이언트의 소켓을 다시 인식 시켜주기 위해서 신호를 걸어주고 무한 poll로 대기하는 상황을 해제 시켜줄수 있는것이죠 ,생각은 이렇게 했으나 문제 점이 많네요 ]
2. mypoll.Add(소켓,이벤트타입); //mypoll 포인터를 공유 하고 있는 다른 쓰레드에서도 가능 , mypoll 함수들은 내부 동기화 되어있음
// 여기서 CPoll의 생성자에서 타이머 값을 INFTIM으로 설정했을 경우 신호를 발생 시킴
3. while
{
mypoll.poll(); // 내부에서 poll 함수 호출
// 발생한 이벤트들을 처리
while(mypoll.IsEOF)
{
리턴값 = mypoll.fetch(버퍼,버퍼크기);
// 리턴값이 poll_read (enum값)이면 읽은 버퍼를 처리
// mypoll_close 일 경우 소켓이 닫힌 경우 이므로
// 자동으로 mypoll 내부에서 클라이언트 소켓이 제거되기 때문에 아무 처리 안해줘도 상관없음
}
이런식으로 설계를 하고 만들었습니다
단 Add를 할때 poll 의 블럭킹을 풀기 위한 신호 발생은... 좀 무리가
아닌듯 싶기도 하네요...
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
man pthread_mutex_t 해보니 나오네요
ASYNC-SIGNAL SAFETY
The mutex functions are not async-signal safe. What this means is that
they should not be called from a signal handler. In particular, calling
pthread_mutex_lock or pthread_mutex_unlock from a signal handler may
deadlock the calling thread.
근데.....
뜻하는 봐가...... 신호를 받아도 그대로 블럭된다는 말로 봤는데 맞는건지 --;
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
제가 알기로는 pthread_mutex_lock() 이 signal이 발
제가 알기로는 pthread_mutex_lock() 이 signal이 발생한다고 해서 return이 되지는 않습니다.
mutex lock을 획득하려고 wait상태에 있는 상황에서도 signal이 발생할수 있고, 그런 상태에서 signal이 발생한다면 signal handler 함수가 호출되므로(물론 signal()이나 sigaction으로 등록시킨 경우에..) signal handler 함수 내부에서 mutex lock을 획득하려는 시도는 dead lock을 야기시킬 수 있다는 것 뿐이죠.
아시겠지만 말씀하신 ASYNC-SIGNAL 은 signal을 발생시킨 context가 자신이 아니라 다른 context- 다른 thread나 혹은 shell에서 의도적으로 signal을 주는 경우- 에서 발생시킨 signal이란 의미죠.
Linux 환경이시라면 Linux thread에서의 signal에 대해서 다음 FAQ를 참고하실만 할겁니다.
http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html#J
사설입니다만... 무엇을 어떤 방식으로 구현하시려는지는 모르겠지만... 개인적인 생각으로는 가능하시다면 multi-thread 환경에서 signal을 주된 notification방식으로 사용하시는것은 피하시는게 좋지 않을까 싶습니다.
궁극적으로 원하시는것이 어떤것인지를 말씀해 주신다면... signal 말고 대안을 같이 생각해 볼수 있지 않을까요?
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
첨언하면... 어떤 함수의 실행 중에 signal이 발생하여 interr
첨언하면... 어떤 함수의 실행 중에 signal이 발생하여 interrupt 되어 return되는지를 판단해야 한다면... 저는 해당 함수의 man page에서 ERRORS 항목에 EINTR이 있는지를 확인합니다.
있다면... 그렇다는 거고... 없다면 signal이 발생된다고 해서 return하는 일은 없다고 보는거죠..
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
poll를 구현함에 있어서.....
그렇네요
[다행이 man page에는 ERROS에 EINTR이 없는 ㅎㅎ]
poll를 CPoll 클래스로 만들어 구현하려고 하는데
[다 만들긴 했는데 테스트를 못해봐서 , 소스를 공개를 하려 하는데
KLDP에서는 자료실이 없나요?]
인터페이스로는 Add , poll , fetch , IsEOF 이런식으로 만들고
사용법은
1. CPoll mypoll(클라이언트 최대값,타이머값)
[여기서 중요한게 타이머값이 INFTIM일 경우 poll 함수의 타이머값이 무한데로
설정되는데 있습니다 그런데 mypoll 다른 쓰레드에서도 mypoll.Add 해줄수 있기때문에 Add 해준 클라이언트의 소켓을 다시 인식 시켜주기 위해서 신호를 걸어주고 무한 poll로 대기하는 상황을 해제 시켜줄수 있는것이죠 ,생각은 이렇게 했으나 문제 점이 많네요 ]
2. mypoll.Add(소켓,이벤트타입); //mypoll 포인터를 공유 하고 있는 다른 쓰레드에서도 가능 , mypoll 함수들은 내부 동기화 되어있음
// 여기서 CPoll의 생성자에서 타이머 값을 INFTIM으로 설정했을 경우 신호를 발생 시킴
3. while
{
mypoll.poll(); // 내부에서 poll 함수 호출
// 발생한 이벤트들을 처리
while(mypoll.IsEOF)
{
리턴값 = mypoll.fetch(버퍼,버퍼크기);
// 리턴값이 poll_read (enum값)이면 읽은 버퍼를 처리
// mypoll_close 일 경우 소켓이 닫힌 경우 이므로
// 자동으로 mypoll 내부에서 클라이언트 소켓이 제거되기 때문에 아무 처리 안해줘도 상관없음
}
이런식으로 설계를 하고 만들었습니다
단 Add를 할때 poll 의 블럭킹을 풀기 위한 신호 발생은... 좀 무리가
아닌듯 싶기도 하네요...
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
댓글 달기