2017-10-23 16 views
0

이 요청은 PThreads에 관한 것이고 조건 또는 신호를 사용하여 연속주기 작업자 스레드를 일시 중지/다시 시작합니다.pthread_kill 대 특정 지점에서 스레드 일시 중지/다시 시작을위한

기본적으로 https://stackoverflow.com/a/23945651/6421961

는, 사용자 johnnycrash가 sigwait()는 (외부 각성 대기) 일시 정지 상태로 스레드를 얻을 수 및 pthread_kill은을 (사용

A는 얼마 전, 나는이 들어왔다 thread_id, USR1) 스레드를 깨우도록 신호를 보냅니다. 그는 뮤텍스 + 조건 구조를 사용하는 것보다 빠르다고 주장하며 덜 복잡해 보입니다. 나는 실제로 신호가있을 때까지 잠을 자고 무한 사이클 (먹이 사 먹이 패러다임을 먹는 사람)에서 일을 마치고 잠을 자도록하는 소프트웨어를 개발 중이다. 나는 별도의 스레드가 작업자 스레드의 결론을 기다리는 데 사용하고 있습니다. 현재 구현에서, worker 쓰레드는 뮤텍스에 의해 보호받는리스트에 핸들을 추가하고, 기다리는 쓰레드에 pthread_kill을 신호하고 pthread_join으로 끝냅니다.

내 질문은 모든 관련이 있습니다

  1. 어떻게 유효 실제로 pthread_kill은() + sigwait() 대신 뮤텍스 + 조건을 사용할 수 있나요?
  2. 허용되는 해결책 인 경우 어떤 함정/경쟁 조건 을 알고 있어야합니까?
  3. 대신 pthread_sigqueue()을 사용하는 것이 더 좋습니까? pthread_kill()? sigwait()이 실행 중이 아니며 즉시 처리 할 수 ​​있습니까? sigwait()이 호출되면 즉시 처리 할 수 ​​있습니까? 내가 찾은 몇 가지 모순 정보에서 파생
  4. 마지막 질문은 : 다른 스레드는 모두 sigwait()USR1 독립적으로 신호를받을 수있을 기대, 또는 그 중 하나가 실제로 관계없이 신호를 잡을 수있을 것입니다 일시 정지 것인가 그 중 하나가 신호를 받았습니까?
+0

세마포어 란 무엇입니까? 'sem_post()'/'sem_wait()'를 사용하는 것은 신호를 사용하는 것보다 훨씬 간단합니다. –

+0

더 정확한 정보를 제공하기 위해 제 질문을 업데이트했습니다. 대체 구문과 비교할 때 세마포어가 얼마나 효율적입니까? – Joaommp

답변

0

나는 포인트 14에 답하려고 노력할 것이다.

  1. pthread_kill() + sigqueue()mutex+condition는 모두 자신의 목적을 가지고있다. 이 경우 다중 스레드에서 사용하는 데이터 (예 : 전역 변수)를 사용하는 경우 mutex이 더 적합합니다. 그러나 외부 이벤트 (예 : 네트워크 패킷)를 기다리고있을 때 해당 이벤트를 기반으로 스레드에 신호를 보내려는 경우 pthread_kill()이 더 적합합니다.

  2. 신호 (USR1)가 전송 된 방법에 따라 다릅니다. pthread_kill() 또는 pthread_sigqueue()을 사용하여 전송 한 경우 해당 신호를 보내는 스레드를 지정할 수 있습니다. 유일한 차이는 pthread_sigqueue()입니다. 신호로 추가 정보를 보낼 수 있습니다. kill()을 사용하여 특정 pid 또는 그룹 별 신호 전송으로 신호를 보낼 수도 있습니다. 그래서, 그것은 당신의 필요에 크게 의존합니다.

+0

나는 소스를 찾기 위해 노력 해왔다. (실제로 stackoverflow에있는 또 다른 스레드였다.) pthread_kill은 실제로 어떤 스레드로 신호를 보내는 지 신경 쓰지 않는다. 두 스레드가 같은 신호를 기다리고 있다면, 어느 한 스레드가 그것을 잡을 수 있습니다. 달성하려는 내용에 대한 자세한 설명을 반영하여 질문을 업데이트했습니다. 그 유스 케이스에 대해 가능한 최상의 구현을 사용하기를 희망한다. – Joaommp