차이점: 1. 조건 변수를 사용하면 모든 대기자를 한 번에 깨울 수 있지만 세마포는 깨울 수 없습니다. 2. 세마포는 항상 값(상태)을 갖는 반면, 조건 변수는 값이 없으며 숫자를 기록할 장소가 없습니다. 3. 세마포어의 목적은 프로세스 간 동기화이고, 조건 변수의 목적은 스레드 간 동기화입니다.
이 튜토리얼의 운영 환경: linux5.9.8 시스템, Dell G3 컴퓨터.
조건 변수
조건 변수(cond)는 멀티 스레드 프로그램에서 "대기--->깨우기" 논리를 구현하기 위해 일반적으로 사용되는 방법이며 프로세스 간 동기화를 위한 메커니즘입니다. 조건 변수는 조건이 충족되어 트리거될 때까지 스레드를 차단하는 데 사용됩니다. 일반적으로 조건 변수와 뮤텍스는 동시에 사용됩니다.
일반 조건 변수에는 두 가지 상태가 있습니다.
(1) "조건 변수의 조건이 설정됨"을 기다리는 동안 하나/여러 스레드가 정지됩니다.
(2) 다른 스레드가 "조건 변수가 설정되면" 다른 스레드에 알립니다. 스레드.
조건 변수 사용:
#include <pthread.h> struct msg { struct msg *m_next; /* ... more stuff here ... */ }; struct msg *workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void process_msg(void) { struct msg *mp; for (;;) { pthread_mutex_lock(&qlock); while (workq == NULL) pthread_cond_wait(&qready, &qlock); mp = workq; workq = mp->m_next; pthread_mutex_unlock(&qlock); /* now process the message mp */ } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); }
물론 조건 변수를 트리거할 때 다음 코드를 사용할 수도 있습니다. 두 방법 모두 장단점이 있습니다.
void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_cond_signal(&qready); pthread_mutex_unlock(&qlock); }
세마포어
세마포어는 특별한 종류입니다. 변수 액세스는 원자적입니다.
두 가지 작업만 허용됩니다.
(1) 세마포어를 기다립니다
세마포어 값이 0이면 프로그램은 대기하고 세마포어 값이 0보다 크면 세마포어는 1만큼 감소하고 프로그램은 계속해서 달리고 있습니다.
(2) 세마포어를 보냅니다
세마포어 값에 1을 더합니다.
참고: Linux는 헤더 파일 sys/sem.h에 선언된 세마포어 API 세트를 제공합니다.
linux 조건변수와 세마포어의 차이점:
(1) 조건변수를 사용하면 모든 웨이터를 한꺼번에 깨울 수 있지만 이 세마포어에는 이 기능이 없다는 점이 가장 큰 차이점이라고 생각합니다.
(2) 세마포어에는 항상 값(상태)이 있지만 조건 변수에는 깨어난(신호 보내기) 횟수를 기록할 곳이 없고, 어떻게 깨어났는지 기록할 곳이 없습니다. 여러 번 깨어났습니다(대기 반환). 구현 관점에서 세마포어는 뮤텍스 + 카운터 + 조건 변수를 사용하여 구현할 수 있습니다. 세마포어에는 상태가 있기 때문에 정확한 동기화를 원한다면 세마포어에 특별한 기능이 있을 수 있습니다. 세마포어는 조건 변수에서 웨이크업 손실 문제를 해결할 수 있습니다.
(3) 세마포어의 목적은 프로세스 간 동기화이고 뮤텍스 잠금 및 조건 변수의 목적은 스레드 간 동기화이지만 세마포어는 스레드 간에 사용할 수도 있고 뮤텍스 잠금 및 조건 변수도 스레드 간에 사용할 수 있습니다. 프로세스. 실제 상황에 따라 결정을 내려야 합니다. 세마포어에 대한 가장 유용한 시나리오는 사용 가능한 리소스의 양을 나타내는 것입니다.
전형적인 문장:
뮤텍스는 세마포어의 특별한 경우입니다. 뮤텍스의 본질은 잠금입니다.
관련 추천: "Linux 비디오 튜토리얼"
위 내용은 Linux에서 조건 변수와 세마포어의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!