2012-09-05 3 views
0

동기를 위해 POSIX 세마포 (초기 값 = 1을 가진 뮤텍스로 사용됨)를 사용하는 스레드 안전 라이브러리를 작성해야합니다. 비동기 신호를 올바르게 관리하기 위해 몇 가지 문제점을 발견했습니다. 이 정적 라이브러리 및 응용 프로그램 (다중 스레드) 라이브러리 함수를 호출하는 응용 프로그램을했습니다. 구조가 POSIX 세마포어에 의해 제어되는 몇 가지 내부에 대한 접근은 (는 도서관 내부의) : 비동기 신호 경우다중 스레드 응용 프로그램에서 비동기 신호로 공유 POSIX 세마포를 관리하는 방법

void library_func1(lib_handler *h) 
{ 
    sem_wait(sem); 
    /* do some stuff with global data */ 
    sem_post(sem); 
} 

void library_func2(lib_handler *h) 
{ 
    sem_wait(sem); 
    /* do some stuff with global data */ 
    sem_post(sem); 
} 

void library_close(lib_handler *h) 
{ 
    ... 
} 

무엇,의는 SIGINT을 가정 해 봅시다의 첨부 제기되고 하나 개의 스레드가 세마포어를 고정 할 때? semaphore가 존재하고 값이 0이기 때문에 나는 응용 프로그램을 다시 시작하면 교착 상태가 발생합니다. 비동기 신호가 발생했을 때 세마포어를 해제 할 수있는 함수가 library_close인데, 이것을 수행하는 가장 좋은 방법은 무엇입니까? (나는 그 함수가 exit 뒤에 오는 경우에만 신호 안전성이 있다고 생각합니다)? 멀티 스레드 응용 프로그램에서는 일반적으로 모든 신호에 대해 단일 스레드 관리자를 사용하는 것이 좋습니다.이 스레드는 라이브러리에 있거나 응용 프로그램에서 시작해야합니다.

감사합니다.

답변

-1

정적 라이브러리의 상태는 다른 앱 실행 사이에 이어지지 않으며 다른 앱에서 공유하지 않습니다. 그것은 그것을 사용하는 응용 프로그램의 상태의 일부입니다. 따라서 세마포는 불안정한 상태가 아닙니다.

+0

세마포는 응용 프로그램간에 공유됩니다. – MirkoBanchi

+0

어떻게? 어떤 유형의 프로세스 간 통신 체계를 사용하고 있습니까? – insomniac2846

+0

POSIX 세마포어는 예를 들어'/ dev/shm '을 통해 액세스 할 수 있으므로 프로세스간에 공유됩니다. – MirkoBanchi

0

리눅스 퓨 텍스에는 동일한 문제가있었습니다. 그것은 완전히 해결할 수있는 것은 아니지만, 당신이 할 수있는 일은 동일한 공유 메모리 영역의 어딘가에 세마포어를 잠그는 프로세스의 PID를 작성하는 것입니다. 다른 프로세스가 세마포어를 잠그려고하고 너무 오래 걸리면 (너무 길기 때문에) 공유 메모리에서 pid를 읽음으로써 세마포어가 잠겨있는 프로세스를 찾습니다. 이 프로세스가 더 이상 존재하지 않으면 교착 상태에 빠졌음을 알 수 있습니다 (라이브러리의 내부 데이터가 일관성이없는 상태 일 수 있기 때문에 그냥 죽어 야합니다).

잠금을 취하는 프로세스가 잠긴 직후에 pid를 기록하기 전에 죽을 수 있으므로 여전히 이와 같은 작은 경쟁이 있습니다. AFAIK 세마포어를 사용하여 이것을 피할 방법이 없습니다. (aquire에서 잠금 변수에 pid가 원자 적으로 기록되는 잠금 구현이있는 경우 작동하지만 사용자가 직접 작성해야 할 수 있습니다.)