조건변수 다. 조건부 변수. 애플리케이션. 액션스크립트 기초

프로그램에서 논리를 구현하기 위해 조건문이 사용됩니다. 추론적으로 이러한 연산자는 노드 포인트로 표현될 수 있으며, 노드 포인트에 도달하면 프로그램은 다음으로 이동할 수 있는 방향을 선택합니다. 예를 들어, 일부 변수 arg에 양수 또는 음수가 포함되어 있는지 확인하고 해당 메시지를 화면에 표시하려고 합니다. 이를 위해 유사한 검사를 수행하는 if 문을 사용할 수 있습니다.

가장 간단한 경우 이 if 문의 구문은 다음과 같습니다.

if(표현식)

표현식 매개변수의 값이 true이면 명령문이 실행되고, 그렇지 않으면 프로그램에서 건너뜁니다. "표현식"은 일부 조건을 테스트하는 조건식이라는 점에 유의해야 합니다. 테이블에 2.1은 if 연산자의 간단한 논리식에 대한 옵션을 제공합니다.

표 2.1. 간단한 부울 표현식

다음은 if 분기 연산자를 사용하는 예입니다. 다음 프로그램을 사용하면 입력된 변수의 부호를 결정할 수 있습니다.

목록 2.1. 입력된 숫자의 부호를 결정하는 첫 번째 프로그램입니다.

#포함하다
정수 메인()
{
플로트 x;
printf("번호를 입력하세요 : ");
scanf("%f",&x);
if(x >= 0)

0을 반환합니다.
}

위의 프로그램 텍스트를 분석하면 두 개의 조건문이 다음 구성을 사용하여 하나로 대체될 수 있음을 알 수 있습니다.

if(표현식)

이는 이렇게 해석됩니다. "expression"이 true이면 "statement1"이 실행되고, 그렇지 않으면 "statement2"가 실행됩니다. 이 구성을 사용하여 숫자의 부호를 결정하는 이전 예제를 다시 작성해 보겠습니다.

목록 2.2. 입력된 숫자의 부호를 결정하는 두 번째 프로그램입니다.

#포함하다
정수 메인()
{
플로트 x;
printf("번호를 입력하세요 : ");
scanf("%f",&x);
if(x printf("입력한 숫자 %f는 음수입니다.\n", x);
또 다른
printf("입력된 숫자 %f는 음수가 아닙니다.\n", x);

0을 반환합니다.
}

제시된 예에서 if 및 else 문 뒤에는 printf() 함수가 하나만 있습니다. 조건이 충족되었을 때 둘 이상의 명령문을 작성해야 하는 경우 중괄호를 사용해야 합니다. 다음과 같은 구성을 사용하십시오.

if(표현식)
{

}
또 다른
{

else 키워드 뒤에 공식적으로 또 다른 if 조건문을 배치할 수 있으며, 이는 조건부 점프를 더욱 유연하게 구성할 수 있다는 점에 유의해야 합니다.

if(표현식1)
그렇지 않은 경우(표현식2)
또 다른

목록 2.3은 후자의 조건부 점프 구성을 구현하는 프로그램을 보여줍니다.

목록 2.3. 입력된 숫자의 부호를 결정하는 세 번째 프로그램입니다.

#포함하다
정수 메인()
{
플로트 x;
printf("번호를 입력하세요 : ");
scanf("%f",&x);
if(x printf("입력한 숫자 %f는 음수입니다.\n", x);
그렇지 않은 경우(x > 0)
printf("입력된 숫자 %f는 양수입니다.\n", x);
또 다른
printf("입력된 숫자 %f는 음수가 아닙니다.\n",x);

0을 반환합니다.
}

지금까지 우리는 x && - 논리적 AND와 같은 간단한 조건을 고려했습니다.
|| - 논리적 OR
! – 논리적 NO

이 세 가지 논리 연산을 기반으로 보다 복잡한 조건이 생성될 수 있습니다. 예를 들어, 세 개의 변수 exp1, exp2 및 exp3이 있는 경우 표에 표시된 논리적 구조를 형성할 수 있습니다. 2.2.

표 2.2. 복합 논리식의 예

수학의 곱셈 및 덧셈 연산과 마찬가지로 논리 연산 AND OR NOT에도 고유한 우선순위가 있습니다. NO 작업의 우선순위가 가장 높습니다. 이 작업이 먼저 수행됩니다. AND 연산의 우선순위가 가장 낮고, 마지막으로 OR 연산의 우선순위가 가장 낮습니다. 복잡한 조건을 작성할 때 이러한 우선순위를 고려해야 합니다. 예를 들어, 조건

if(4 6 || 5는 이런 방식으로 테스트됩니다. If 4 6 OR 5 if(4 6 || 5 if 조건 연산자를 사용하면 소수의 가능한 옵션 중에서 선택해야 하는 프로그램을 작성하기가 더 쉽습니다. 그러나 , 때때로 프로그램은 가능한 많은 옵션 중에서 하나를 선택해야 합니다. 공식적으로는 if else if ... else 구성을 사용할 수 있습니다. 그러나 많은 경우에는 스위치 연산자를 사용하는 것이 더 편리합니다. C++ 언어의 구문은 다음과 같습니다.

스위치(변수)
{
대소문자 상수1:

대소문자 상수2:

...
기본:

이 연산자는 변수가 키워드 케이스 뒤에 있는 상수와 동일한지 순차적으로 확인합니다. 변수 값과 동일한 상수가 없으면 default라는 단어 뒤의 명령문이 실행됩니다. switch 문에는 다음과 같은 기능이 있습니다. 변수의 값이 상수1의 값과 같고 첫 번째 키워드 케이스 이후의 명령문이 실행된다고 가정해 보겠습니다. 그 후에는 변수가 상수2와 같은지 확인하여 프로그램 실행이 계속되며, 이로 인해 컴퓨터 리소스가 부당하게 낭비되는 경우가 많습니다. 이러한 상황을 방지하려면 break 문을 사용하여 프로그램을 전환 후 다음 문으로 이동해야 합니다.

목록 2.4에서는 조건부 스위치 문을 프로그래밍하는 예를 보여줍니다.

목록 2.4. switch 문을 사용하는 예입니다.

#포함하다
정수 메인()
{
정수 x;
printf("번호를 입력하세요 : ");
scanf("%d",&x);
스위치(x)
{
사례 1: printf(“입력된 숫자 1\n”);break;
사례 2: printf(“입력된 숫자 2\n”); 부서지다;
기본값: printf("다른 숫자가 입력되었습니다\n");
}
문자 ch;
printf("문자를 입력하세요: ");
scanf("%c",&ch);
스위치(채널)
{
case 'a' : printf("a\n이라는 문자가 입력되었습니다."); 부서지다;
case 'b' : printf("b\n 문자가 입력되었습니다."); 부서지다;
기본값: printf("다른 문자가 입력되었습니다\n");
}
0을 반환합니다.
}

이 예에서는 switch 문의 두 가지 용도를 보여줍니다. 첫 번째 경우에는 입력된 숫자가 분석되고, 두 번째 경우에는 입력된 기호가 분석됩니다. 이 연산자는 나열된 케이스 값 중 하나에 대한 인수의 동일성을 기준으로만 선택할 수 있다는 점에 유의해야 합니다. x와 같은 표현식 확인

조건부 변수

조건 변수(condvar는 조건 변수의 약자)는 코드의 중요한 섹션을 실행하는 동안 일부 조건에 따라 스레드를 차단하는 데 사용됩니다. 조건은 원하는 만큼 복잡할 수 있으며 조건 변수에 의존하지 않습니다. 그러나 조건을 테스트하려면 조건 변수를 항상 뮤텍스와 함께 사용해야 합니다.

조건부 변수는 다음 기능을 지원합니다.

· 조건변수를 기다리는 중 (wait) ( pthread_cond_wait());

· 단일 스트림 차단 해제(신호)( pthread_cond_signal())

· 다중 스트림 차단 해제(방송)( pthread_cond_broadcast()),

다음은 조건부 변수의 일반적인 사용 예입니다.

pthread_mutex_lock(&m) ;-…

while (!임의의 조건) (

pthread_cond_wait(&cv, &m);

pthread_mutex_unlock (&m) ;

이 예에서는 조건을 확인하기 전에 뮤텍스를 획득합니다. 이렇게 하면 테스트 중인 조건이 현재 스레드에만 적용됩니다. 이 조건이 true인 동안 이 코드 섹션은 다른 스레드가 조건 변수에 대해 단일 또는 다중 스레드 차단 해제 작업을 수행할 때까지 대기 호출을 차단합니다.

위 예제의 while 루프는 두 가지 이유로 필요합니다. 첫째, posix 표준은 잘못된 깨우기(예: 다중 프로세서 시스템)가 없음을 보장하지 않습니다. 둘째, 다른 스레드가 조건을 변경하는 경우 해당 변경 사항이 허용된 기준을 충족하는지 다시 확인해야 합니다. 대기 중인 스레드가 차단되면 조건 변수와 관련된 뮤텍스가 함수에 의해 원자적으로 해제됩니다. pthread_cond_wait()다른 스레드가 프로그램 코드의 중요한 섹션에 들어갈 수 있도록 합니다.

단일 스레드 차단 해제를 수행하는 스레드는 조건 변수에 대기 중인 가장 높은 우선순위 스레드의 차단을 해제합니다. 다중 스레드 차단 해제 작업은 조건 변수에 대기 중인 모든 스레드의 차단을 해제합니다. 조건 변수와 연관된 뮤텍스는 차단 해제된 우선순위가 가장 높은 스레드에 의해 원자적으로 해제됩니다. 코드의 중요 섹션을 처리한 후 이 스레드는 뮤텍스를 해제해야 합니다.

조건변수 대기 연산의 또 다른 유형( pthread__cond_timedwair())을 사용하면 시간 초과를 설정할 수 있습니다. 이 기간이 끝나면 대기 중인 스레드가 차단 해제될 수 있습니다.

장벽

장벽은 상호 작용하는 여러 스레드의 작업을 조정하여 각 스레드가 지정된 지점에서 중지하고 작업을 계속하기 전에 다른 스레드를 기다리도록 하는 동기화 메커니즘입니다.

기능과 다르게 pthread조인(), 스레드가 다른 스레드가 완료될 때까지 기다리는 경우 장벽은 스레드를 강제합니다. 만나다특정 시점에. 지정된 수의 스레드가 구성된 장벽에 도달하면 모두이러한 스레드는 차단 해제되고 작업을 계속합니다. 장벽은 다음 함수를 사용하여 생성됩니다. pthread_barrier_init():

#포함하다

pthread_barrier_init (pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count);

이 코드는 attr 인수에 의해 설정된 속성을 사용하여 지정된 주소(장벽에 대한 포인터는 Barrier 인수에 있음)에 장벽을 만듭니다. count 인수는 pthread_barrier_wait()를 호출해야 하는 스레드 수를 지정합니다.

장벽을 생성한 후 각 스레드는 pthread_barrier_wait() 함수를 호출하여 이 작업의 완료를 알립니다.

#포함하다

int pthread_barrier_wait(pthread_barrier_t "장벽)";

스레드가 함수를 호출할 때 pthread_barrier_wait(),함수에 의해 지정된 스레드 수까지 차단됩니다. pthread_barrier_init(), 함수를 호출하지 않습니다 pthread_jbarrier_wait()따라서 차단되지 않습니다. 지정된 수의 스레드가 함수를 호출한 후 pthread_barrier_wait(), 모두 잠금 해제되었습니다 동시에.

#포함하다

#포함하다

#포함하다

#포함하다

pthread_barrier_t 장벽; // "barrier" 유형의 동기화 개체

main() // 인수 무시

time_t now;// 카운터 값이 3인 장벽을 만듭니다.

pthread_barrier_init(&barrier, NULL, 3); // 두 개의 스레드 시작 - threadl 및 thread2

pthread_create(NOLL, NOLL, threadl, NULL); // threadl과 thread2 스레드가 실행 중입니다.

pthread_create(NDLL, NDLL, thread2, NDLL);//완료 대기

printf("main()이 %s에서 장벽을 기다리고 있습니다", ctime (&now));

pthread_barrier_wait (&barrier); // 이 시점 이후에는 세 스레드가 모두 종료됩니다.

printf("mainO의 장벽이 %s에 완료되었습니다.", ctime (&now));

threadl (void *사용되지 않음)

지금이 시간); // 계산 수행

printf("%s에서 시작하는 스레드", ctime (&now)) // 일시 중지

pthread_barrier_wait (&barrier) ;// 이 시점 이후에는 세 스레드가 모두 종료됩니다.

printf("threadl()의 장벽이 %s에 완료되었습니다.", ctime (&now)) ;

thread2(void *not__used)

지금이 시간); // 계산 수행

printf("thread2는 %s에서 시작합니다", ctime (&now));

pthread_barrier_wait (&배리어) ;

// 이 시점 이후 세 스레드가 모두 완료됩니다.

printf("thread2()의 장벽이 %s에 완료되었습니다.", ctime (&now));

목록의 예에서 기본 스레드는 장벽을 생성한 후 동기화를 위해 장벽에서 차단된 스레드 수를 계산하기 시작합니다. 이 경우 동기화된 스레드 수는 스레드 main(), 스레드 thread1() 및 스레드 thread2() 3개로 설정됩니다.

스레드 thread1() 및 thread2()가 시작됩니다. 명확성을 위해 계산 프로세스를 시뮬레이션하기 위해 흐름에 일시 중지가 설정됩니다. 동기화를 수행하기 위해 메인 스레드는 장벽에서 차단되고 잠금 해제를 기다립니다. 잠금 해제는 다른 두 스레드가 해당 장벽에서 결합하지 않은 후에 발생합니다.



차단 대기 중

Sleepon 잠금은 몇 가지 예외를 제외하고 조건 변수와 유사하게 작동합니다. 잠금을 기다리는 조건 변수( pthread_sleepon_lock())는 조건이 참이 될 때까지 스레드를 차단하는 데 사용할 수 있습니다(메모리 위치 값을 변경하는 것과 유사). 그러나 조건 변수(테스트 중인 모든 조건에 대해 존재해야 함)와 달리 대기 잠금은 테스트 중인 조건 수에 관계없이 단일 mm.tex 및 동적으로 생성된 조건 변수에 적용됩니다. 조건 변수의 최대 수는 궁극적으로 차단된 스레드의 최대 수와 같습니다.

대담자 또는 기타 텍스트 정보에 대한 지식을 저장할 수 있습니다. 이제 템플릿을 작성할 때 미리 정해진 목적을 가진 13개의 변수와 정보 소유자가 재량에 따라 사용할 수 있는 100개의 "무료" 변수를 사용할 수 있습니다.
주어진 목적을 가진 변수에는 "말하는" 이름이 있습니다. 예를 들어, %사용자 이름대담 자의 이름을 저장하도록 설계된 변수입니다. 그녀의 이름은 영어 단어 user("user")와 name("name")을 사용합니다. 이러한 변수는 프로젝트의 모든 사용자 정보가 생성되는 표준 정보 템플릿 데이터베이스를 생성할 때 개발자가 적극적으로 사용합니다.
이러한 변수의 수명은 제한되지 않습니다. 그 의미는 개별 대화 사이에 기억되고 저장됩니다.

템플릿에 쓰여진 내용 대화의 예
이름을 기억하세요:
$ 내 이름은 *입니다
# 만나서 반가워요. [%user_name="[*1]"]
손님:내 이름은 바샤야
정보:한 번 만나러 갑니다.
응답 정보에 대담자의 이름이 표시됩니다.
$ 안녕, 정보.
# [%user_name]님, 안녕히 계세요.
손님:안녕, 인프.
정보:안녕, 바샤.
%user_name 변수의 값에 따라 답을 선택합니다.
$ 내 이름 기억나?
# (물론입니다. 귀하는 [%user_name]님입니다.)
# (아니요. 이름을 안 알려주셨어요.)
손님:내 이름을 기억하나요?
정보:틀림없이. 당신은 바샤입니다.
또는
손님:내 이름을 기억하나요?
정보:아니요. 당신은 나에게 당신의 이름을 말하지 않았습니다.
대화 상대의 이름을 더 이상 저장하고 싶지 않으므로 변수를 재설정합니다.
$당신은 바보입니다.
#그렇습니다. 저는 더 이상 당신과 친구가 아니며 당신의 이름도 잊어버렸습니다. [%user_name=""]
손님:당신은 바보 야.
정보:그게 다야, 나는 더 이상 당신과 친구가 아니며 당신의 이름도 잊어버렸습니다.

변수에 값 할당 및 변수 지우기

변수에 값을 할당하거나 답변에서 값을 0으로 재설정할 수 있습니다.

통사론:[%변수 = "값"]
변수 할당 명령은 항상 대괄호로 둘러싸여 있는데, 여기서는 서비스 문자입니다. 변수의 값은 항상 따옴표로 묶여 있습니다.
값 할당의 예:
$ 나는 로큰롤을 춘다.
#부러워요. Inf는 춤을 출 수 없습니다. [%var1="dancing"]

$*증오*춤*
$*춤*증오*
$ *춤추지 마세요*
# 불쌍해. 내가 사람이라면 분명 춤을 췄을 텐데. [%var1="춤추는 것을 좋아하지 않습니다"]

$ 저는 **살이에요.
# 멋진 나이! [%user_age="[*1]"]

변수 재설정의 예:
$ 내 나이에 대해 이야기하는 것을 원하지 않습니다.
# 당신이 뭐라고 말하든 [%user_age=""]

set 함수를 사용하여 변수에 값 할당

기능 set("인수1", "인수2", "인수3") Argument2를 대신하여 Argument1에 지정된 변수에 해당 값을 할당합니다. Argument3의 기본값은 빈 문자열입니다. 빈 문자열이 아닌 다른 것으로 지정하면 set 함수 대신 텍스트가 대체되지 않으며 변수 값만 할당됩니다.

예를 들어,
$내 이름은 **입니다
#만나서 반가워요, [@set("user_name", "[@ ("[*1]")]")]님!

손님:내 이름은 바샤야
정보:만나서 반가워요, 바샤!

또는:
$내 이름은 **입니다
#당신의 이름을 기억하겠습니다. [@set("user_name", "[@ ("[*1]")]", "1")]

$ * *가 무엇인지 * 내 * 이름 *
# 당신은 [%user_name]입니다.

손님:내 이름은 레나예요
정보:나는 당신의 이름을 기억할 것입니다.
손님:내 이름이 뭐죠?
정보:당신은 레나입니다.

infa 응답에 변수 값 표시

정보가 답변의 변수 값을 "음성화"하려면 답변에 이 변수를 작성하기만 하면 됩니다.
통사론:[%변하기 쉬운]
대괄호가 필요합니다.

예:
$ 안녕, 로봇!
# [%user_name]님, 안녕히 계세요!

조건부 변수

조건변수발생한 이벤트를 알리는 데 사용되는 세마포어입니다. 하나 이상의 프로세스(또는 스레드)가 다른 프로세스나 스레드에서 일부 이벤트가 발생했다는 신호를 기다리고 있을 수 있습니다. 위에서 설명한 조건 변수와 뮤텍스 세마포어의 차이점을 이해해야 합니다. 뮤텍스 세마포어 및 읽기-쓰기 잠금의 목적은 데이터에 대한 액세스를 동기화하는 반면, 조건 변수는 일반적으로 일련의 작업을 동기화하는 데 사용됩니다. 그의 책에서는 이 주제에 대해 UNIX 네트워크 프로그래밍 W. Richard Stevens는 다음과 같이 말했습니다. 기다리는 것이 아니라 차단을 위해 뮤텍스를 사용해야 합니다. ».

목록 4.6에서 소비자 스레드에는 루프가 포함되어 있습니다.

15 while(TextFiles.empty())

소비자 스레드는 대기열에 포함될 때까지 루프를 반복했습니다. 텍스트파일요소가 있었습니다. 이 루프는 조건부 루프로 대체될 수 있습니다. 엔나야. 생산자 스레드는 요소가 대기열에 배치되었음을 소비자에게 알립니다. 소비자 스레드는 신호를 받을 때까지 기다린 다음 대기열 처리를 진행할 수 있습니다.

조건 변수는 pthread_cond_t 유형입니다. 수행할 수 있는 작업 유형은 다음과 같습니다.

초기화;

파괴;

기대;

시간 제한이 있어서 기다리고 있습니다.

주소 지정이 가능한 경보;

범용 경보;

초기화 및 소멸 작업은 다른 뮤텍스의 유사한 작업과 유사하게 조건 변수에 의해 수행됩니다. 클래스 함수 pthread_cond_t,이러한 작업을 구현하는 방법은 표에 나열되어 있습니다. 5.7.

표 5.7. 조건 변수 연산을 구현하는 pthread_cond_t 클래스의 함수

조건 변수는 뮤텍스와 함께 사용됩니다. 뮤텍스를 잠그려고 하면 뮤텍스가 해제될 때까지 스레드나 프로세스가 차단됩니다. 차단이 해제되면 스레드나 프로세스는 뮤텍스를 수신하고 작업을 계속합니다. 조건 변수를 사용할 때는 뮤텍스와 연결되어야 합니다.

pthread_mutex_lock(&Mutex) ;

pthread_cond_wait(&EventMutex, &Mutex);

pthread_mutex_unlock(&Mutex) ;

따라서 일부 작업이 뮤텍스를 잠그려고 합니다. 뮤텍스가 이미 잠겨 있으면 이 작업이 차단됩니다. 작업 잠금을 해제한 후 뮤텍스가 해제됩니다. 뮤텍스동시에 조건 변수에 대한 신호를 기다립니다. 이벤트뮤텍스 . 뮤텍스가 잠겨 있지 않으면 작업은 신호를 무기한 기다립니다. 시간 초과 대기를 사용하면 작업은 지정된 시간 동안 신호를 기다립니다. 작업이 신호를 받기 전에 이 시간이 만료되면 함수는 오류 코드를 반환합니다. 그런 다음 작업은 뮤텍스를 다시 요청합니다.

주소 신호를 수행함으로써 작업은 일부 이벤트가 발생했음을 다른 스레드나 프로세스에 알립니다. 작업이 주어진 조건 변수에 대한 신호를 기다리고 있는 경우 해당 작업은 차단 해제되고 뮤텍스를 받습니다. 여러 작업이 동시에 주어진 조건 변수에 대한 신호를 기다리고 있는 경우 그 중 하나만 잠금 해제됩니다. 나머지 작업은 대기열에서 대기하며 사용된 예약 전략에 따라 해제됩니다. 전역 신호 작업이 수행되면 지정된 조건 변수에 대한 신호를 기다리는 모든 작업에 알림이 전달됩니다. 여러 작업이 잠금 해제되면 사용된 스케줄링 전략에 따라 뮤텍스 소유권을 놓고 경쟁합니다. 대기 작업과 달리 신호 작업을 수행하는 작업은 뮤텍스의 소유권을 주장해야 하지만 이를 주장하지 않습니다.

조건 변수에는 속성 개체도 있으며 그 기능은 표에 나열되어 있습니다. 5.8.

표 5.8. pthread_cond_t 유형의 조건 변수에 대한 속성 객체에 액세스하기 위한 함수


정수 pthread_condattr_init(pthread_condattr_t * attr) attr로 지정된 조건 변수 속성 객체를 모든 구현 정의 속성에 대한 기본값으로 초기화합니다.

정수 pthread_condattr_destroy(pthread_condattr_t * attr) ; attr 매개변수로 지정된 조건 변수 속성 개체를 삭제합니다. 이 객체는 pthread_condattr_init()를 호출하여 다시 초기화할 수 있습니다.

정수 pthread_condattr_setpshared(pthread_condattr_t * attr,int pshared);

정수 pthread_condattr_getpshared(const pthread_condattr_t * 제한 attr, int *restrict pshared); attr로 지정된 조건 변수 속성 객체의 프로세스 공유 속성을 설정하거나 반환합니다. pshared 매개변수에는 다음 값이 포함될 수 있습니다.

PTHREAD_PROCESS_SHARED(스레드가 다른 프로세스에 속하더라도 이 조건 변수에 할당된 메모리에 액세스할 수 있는 모든 스레드가 읽기-쓰기 잠금을 공유할 수 있도록 허용합니다.)

PTHREAD_PROCESS_PRIVATE(조건변수는 동일한 프로세스의 스레드 간에 공유됩니다.)

정수 pthread_condattr_setclock(pthread_condattr_t * attr, clockid_t clock_id);

정수 pthread_condattr_getclock(const pthread_condattr_t * 제한 attr, clockid_t * 제한 clock_id); 속성을 설정하거나 반환합니다. 시계매개변수에 의해 지정된 조건 변수의 속성 객체 속성. 기인하다 시계 pthread_cond_timedwait() 함수에서 시간 제한을 측정하는 데 사용되는 시계의 식별자를 나타냅니다. 시계 속성의 기본값은 시스템 시계 식별자입니다.

위에서 언급한 동기화 관계인 시작-시작(CC), 종료-시작(FS), 시작-완료(SF) 및 종료-마침(FF)을 구현하는 데 조건 변수를 사용할 수 있습니다. 이러한 관계는 동일하거나 다른 프로세스의 스레드 간에 존재할 수 있습니다. 목록 5.4와 5.5는 FS 및 FF 동기화 관계 구현의 예를 제공합니다. 각 예제는 두 개의 뮤텍스를 정의합니다. 하나의 뮤텍스는 공유 데이터에 대한 액세스를 동기화하는 데 사용되고 다른 하나는 코드 실행을 동기화하는 데 사용됩니다.

// 목록 5.4. 간의 FS 동기화 관계

// 스레드 2개

pthread_t ThreadA,ThreadB;

pthread_cond_t 이벤트;

무효의 * 작업자1(무효 *X) (

for(int 개수 = l; 개수

pthread_mutex_lock(&Mutex);

pthread_mutex_unlock(&Mutex);

if(숫자 == 50)(

pthread_cond_signal(&이벤트);

무효의 * 작업자2(무효 *X) (

pthread_mutex_lock(&EventMutex);

pthread_cond_wait(&Event,&EventMutex);

for(int 개수 = 1; 개수

pthread_mutex_lock(&Mutex);

숫자 = 숫자 + 20;

pthread_mutex_unlock(&Mutex);

cout ""worker2 함수의 실행이 완료되었습니다." "끝내; 반환(0);

정수 기본(int argc, char *argv) (

pthread_mutex_init(&Mutex,NULL);

pthread_mutex_init(&EventMutex,NULL);

pthread_cond_init(&이벤트, NULL);

pthread_create(&ThreadA, NULL, 작업자l, NULL);

pthread_create(&ThreadB, NULL, 작업자2, NULL);

목록 5.4는 FS 동기화 관계의 구현 예를 보여줍니다. ThreadA는 ThreadB가 시작될 때까지 종료될 수 없습니다. Number가 50이 되면 ThreadA는 이를 ThreadB에 알립니다. 이제 ThreadB는 ThreadA로부터 신호를 받을 때까지 실행을 시작할 수 없습니다. ThreadB는 Event 조건 변수와 함께 EventMutex 개체를 사용합니다. Mutex 객체는 Number 공유 변수의 값을 쓰기 위해 액세스를 동기화하는 데 사용됩니다. 작업은 여러 뮤텍스를 사용하여 다양한 이벤트를 동기화하고 중요한 섹션에 액세스할 수 있습니다.

FF 동기화 관계의 구현 예가 목록 5.5에 나와 있습니다.

// 목록 5.5. // 두 스레드 간의 FF 동기화 관계

pthread_t 스레드A, 스레드B ;

pthread_mutex_t 뮤텍스, EventMutex;

pthread_cond_t 이벤트;

void *workerl(void *X) (

for(int 개수 = l; 개수

pthread_mu tex_l ock (&Mutex);

pthread_mutex_unlock(&Mutex);

cout ""workerl: 번호는 "

pthread_mutex_lock(&EventMutex) ,-

cout "workerl 함수가 기다리고 있습니다. " "끝;

pthread_cond_wait (&Event, &EventMutex) ;

pthread_mutex_unlock(&EventMutex);

무효 *worker2 (무효 *X) (

for(int 개수 = l; 개수

pthread_mutex_lock(&Mutex) ;

숫자 = 숫자 * 2 ;

pthread_mutex_unlock(&Mutex) ;

cout" "worker2: 숫자는 " " Number " endl;

pthread_cond_signal (&이벤트) ;

cout ""worker2 함수가 신호를 보냈습니다" "endl;return(0);

int main(int argc, char *argv) (

pthread_mutex_init (&Mutex,NULL) ;

pthread_mutex_init (&EventMutex,NULL) ;

pthread_cond_init (&이벤트, NULL) ;

pthread_create(&ThreadA, NULL,workerl, NULL);

pthread_create (&ThreadB, NULL, 작업자2, NULL) ;

목록 5.5에서 ThreadA는 ThreadB가 종료될 때까지 종료될 수 없습니다. ThreadA는 루프를 10번 완료해야 하고 ThreadB는 루프를 100번 완료해야 합니다. ThreadA는 ThreadB보다 먼저 반복을 완료하지만 ThreadB가 완료 신호를 보낼 때까지 기다립니다.

CC 및 SF 동기화 관계는 이러한 방식으로 구현할 수 없습니다. 이러한 방법은 모공을 동기화하는 데 사용됩니다. 실행 시간 프로세스.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: