>  기사  >  운영 및 유지보수  >  Linux에서 조건 변수와 세마포어의 차이점은 무엇입니까

Linux에서 조건 변수와 세마포어의 차이점은 무엇입니까

青灯夜游
青灯夜游원래의
2022-05-11 19:18:345987검색

차이점: 1. 조건 변수를 사용하면 모든 대기자를 한 번에 깨울 수 있지만 세마포는 깨울 수 없습니다. 2. 세마포는 항상 값(상태)을 갖는 반면, 조건 변수는 값이 없으며 숫자를 기록할 장소가 없습니다. 3. 세마포어의 목적은 프로세스 간 동기화이고, 조건 변수의 목적은 스레드 간 동기화입니다.

Linux에서 조건 변수와 세마포어의 차이점은 무엇입니까

이 튜토리얼의 운영 환경: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.