장점 :
"세마포어는 비동기 신호 안전한"(참고 [2])
단점 :
"나는 뮤텍스 조건 변수와 완전히 그 기능을 대체 할 수 있고, 적은 경향이 에러 있기 때문에, 필요하지 세마포어 동기화 기본 생각 ... 세마포어의 또 다른 문제는 보통 자신의 카운트 값을 가지고 있다는 것입니다 우리의 데이터 구조는 또한 "2 저장된 동일한 정보의 결과 길이 값을 갖는다 (참조 [1])
"신호를 증가시킬 수있는 스레드가 다른 스레드의 감소량은, 이러한 유연성은 동기 설계의 열악한 구조를 일으킬 수있다"(참고 [2])
결론 :
세마포어 응용 프로그램은, 뮤텍스 + 조건 변수로 대체 간주 될 수 있습니다.
세마포 동시은 "고토"일반적으로 같은 프로그래밍하지만, 간단한 인터페이스, 쉬운 호출을 수행합니다.
------------------------------------------
또한, 올바른 잘못된 생각 : 뮤텍스 등가 (1)의 양의 신호 값.
오직 당신 만이 제조자에 손 하나를 작성해야 - 소비자 싱글 데모 이해할 수있다.
예 1 :
1 // 부호화 스레드 2 thread_encode () { . 3 sem_wait (task_assigned)의] // 차단 대기 태스크 . 4 인코딩 () . 5 sem_post (task_done) // 통지 작업 완료 6 } 7 // 태스크 쓰레드 8. thread_main () { 9. sem_wait (task_done)들; // 태스크의 완료를 기다리지 차단 10 send_data_if_has () . 11 New_Task (); (12)가된다 (task_assigned) sem_post; // 발행 통지 태스크 13이다 } 14 sem_init을 (task_done, 0 , 1이다. );// 초기 상태 "작업이 완료되지" 15 (, task_assigned sem_init를 0 , 0 ) // 작업의 새로운 할당을
비교 예 2
1 // 编码线程 2 thread_encode () { 3 에 pthread_mutex_lock ( 뮤텍스); 4 인코딩 (); 5 pthread_mutex_unlock을 ( 뮤텍스); 6 } 7 // 任务线程 8 thread_encode () { 9 에 pthread_mutex_lock ( 뮤텍스); 10 send_data_if_has (); 11 new_task (); 12 pthread_mutex_unlock을 ( 뮤텍스); 13 }
차
참고
[1] "리눅스 멀티 스레드 서버 측 프로그래밍,"잠금 및 세마포어를 사용하지 않는 읽고 쓸 수 있도록 동기화 필수 장 2.3 스레드
비교 [2] "리눅스 프로그래밍 매뉴얼"P907 POSIX에서는 Pthreads 뮤텍스 세마포어