인수 (예 : 구조체에 대한 포인터)를 신호 처리기에 전달하려면 어떻게해야합니까? 다중 스레드 응용 프로그램을 작성 중이므로 전역 변수를 사용할 수 없습니다.C에서 신호 처리기에 인수 전달
각 스레드에 타이머를 연결합니다. 타이머가 만료되면 구조체를 업데이트해야합니다 (각 스레드마다 다른 구조체가 있음).
어떻게하면됩니까?
인수 (예 : 구조체에 대한 포인터)를 신호 처리기에 전달하려면 어떻게해야합니까? 다중 스레드 응용 프로그램을 작성 중이므로 전역 변수를 사용할 수 없습니다.C에서 신호 처리기에 인수 전달
각 스레드에 타이머를 연결합니다. 타이머가 만료되면 구조체를 업데이트해야합니다 (각 스레드마다 다른 구조체가 있음).
어떻게하면됩니까?
시스템에서 신호 처리기를 호출하는 방법은 고정되어 있습니다.이를 변경하고 추가 사용자 포인터를 추가 할 방법이 없습니다. 따라서 신호 처리기에 추가 데이터를 가져 오려면 전역 변수 (스레드 로컬 일 수 있음)를 사용하는 것이 유일한 방법입니다.
그러나 스레드와 함께 timer_create
을 사용하려는 경우 SIGEV_SIGNAL
이 아닌 SIGEV_THREAD
을 사용하면 훨씬 편리합니다. 후자는 스레드 대신 프로세스으로 신호를 보내 프로세스의 모든 스레드가 걸릴 수 있습니다.
glibc는 _Thread_local 변수를 느리게, 동적으로 할당하는 것처럼 보입니다. (대다수는 좋지 않은 malloc 호출로) _Thread_local에 대한 첫 번째 액세스가 AS 안전하지 않을 수 있습니다. 나는 이것에 대한 더 많은 정보를 찾을 수 없었다. – PSkocik
POSIX 타이머는 에 문서화 된 struct sigevent
구조를 사용하여 프로세스에 만료 사실을 알리는 방법에 대한 세부 정보를 지정할 수 있습니다.
.sigev_value.sival_ptr
멤버를 설정할 수 있습니다 (당신은
struct sigaction
의
.sa_sigaction
부재를 통하여 신호 처리기를 설정해야합니다 구조의
.sa_flags
이
SA_SIGACTION
으로 ORred인지 확인하는 동안).
그런 다음 스레드 로컬 변수를 사용하는 것은 어떻습니까? –
스레드 로컬 변수를 신호 처리기에 전달하는 방법은 무엇입니까? – WindowsEFI
당신은 더 명확 할 수 있습니까? 신호의 유형을 알려주십시오. 그리고 당신이 원하는 결과의 형식은 무엇입니까! –