2012-08-24 6 views
1

SIGSEGV에서 process-id, thread-id 및 backtrace와 같은 정보를 수집하고이 정보를/pipe/socket 파일에 기록하는 처리기를 구현하려고합니다.pthread_spin_trylock은 다중 스레드 응용 프로그램의 sigsegv 처리기에서 안전합니까?

한 스레드가 다른 스레드가 곧 뒤따를 것이라는 SIGSEGV가 발생하면 (아마도 꽤 높은) 가능성이 있다는 점에서 문제가 있습니다. 두 스레드가 동시에 보고서를 작성하는 코드 비트로 만들면 동일한 파일에 대한 쓰기 작업이 인터리브됩니다.

나는 나는 또한 적어도 이가지 경우 here 다른 사람들이이 문제를 해결하기 위해 pthread_spin_trylock을 사용한 최고 대답 here에 연결된 비디오를 본 signal(7) 에 설명 된대로 난 단지 비동기 시그널에 안전 기능을 사용하는 것을 알고있다.

위의 문제를 방지하는 안전한 방법입니까? 대부분의 시스템 pthread_spin_trylock

+0

'C++ '또는'c' 태그 중 하나를 삭제하고 race-condition 태그를 추가하면 더 좋을 것이라고 생각합니다. 이 방법으로 사람들은 어떤 언어로 당신에게 예제를 줄 수 있는지 더 잘 알 것입니다. 경쟁 조건에 대해 알고있는 사람들은이 질문에 관심을 갖게됩니다. –

+0

감사합니다. 제 질문에 대답 할 수있는 사람들을 끌어 들이기 위해 당신이 제안한대로 해왔습니다. – TWMouton

+0

코어 덤프가 당신에게 말하지 않은 정보는 무엇입니까? –

답변

0

방해 안전 적어도 86에() 다른 사람을 위해 말할 수있는 원자 비교 및 ​​스왑 (CAS 명령으로 구현됩니다.

나는 아마를 사용합니다 . 여기에 그런 일이 무엇 확인 을 자신 CAS gcc가의 그것에 대한 문서입니다 : 당신의 기호에

static int lock = 0; // global scope 

: http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html

그리고 예제 코드 al handler :

if (__sync_bool_compare_and_swap(&lock, 0, 1)) { 
    // Got the lock 
} else 
    pthread_exit(); // terminate this thread 
관련 문제