C++ 뮤텍스 잠금

C Myutegseu Jamgeum



C ++는 우수한 성능, 높은 정밀도 및 적절한 메모리 관리 시스템을 갖춘 가장 빠른 프로그래밍 언어 중 하나로 알려져 있습니다. 이 프로그래밍 언어는 또한 여러 스레드 간에 여러 리소스를 공유하여 여러 스레드의 동시 실행을 지원합니다. 멀티쓰레딩에서 쓰레드는 다른 쓰레드가 하고 있는 작업에 영향을 받지 않기 때문에 문제가 되지 않는 읽기 작업만 수행합니다. 그러나 이러한 스레드가 서로 리소스를 공유해야 하는 경우 한 스레드가 그 시간에 데이터를 수정할 수 있어 문제가 됩니다. 이 문제를 해결하기 위해 한 번에 하나의 스레드에만 개체/코드에 대한 액세스를 제공할 수 있다는 동기화를 제공하여 코드/개체에 대한 여러 리소스의 액세스를 방지하는 C++ 'Mutex'가 있습니다. 따라서 여러 스레드가 해당 개체에 동시에 액세스할 수 없습니다.

절차:

뮤텍스 잠금을 사용하여 한 번에 객체에 대한 여러 스레드의 액세스를 중지하는 방법을 알게 될 것입니다. 뮤텍스 잠금의 구문, 다중 스레딩이 무엇인지, 뮤텍스 잠금을 사용하여 다중 스레딩으로 인해 발생하는 문제를 처리하는 방법에 대해 설명합니다. 그런 다음 다중 스레딩의 예를 들어 뮤텍스 잠금을 구현합니다.







통사론:

객체나 코드에 대해 동시에 여러 스레드의 액세스를 방지할 수 있도록 뮤텍스 잠금을 구현하는 방법을 배우고 싶다면 다음 구문을 사용할 수 있습니다.



$ 표준 :: 뮤텍스 mut_x

$mut_x. 자물쇠 ( ) ;

무효 func_name ( ) {

$ // 여러 스레드로부터 숨기고 싶은 코드는 여기에 작성됩니다.

$mut_x. 잠금 해제 ( ) ;

}

이제 더미 예제와 의사 코드(코드 편집기에서 그대로 실행할 수 없음)에서 이 구문을 사용하여 다음에 언급된 대로 이 구문을 정확히 사용할 수 있는 방법을 알려줍니다.



$ 표준 :: 뮤텍스 mut_x

보이드 블록 ( ) {

$mut_x. 자물쇠 ( ) ;

$ 표준 :: 쫓다 << '안녕하세요' ;

$mut_x. 잠금 해제 ( ) ;

}

예시:

이 예제에서는 먼저 다중 스레드 작업을 만든 다음 이 작업을 뮤텍스 잠금 및 잠금 해제로 둘러싸서 생성된 코드 또는 개체에 대한 작업 동기화를 제공하도록 합시다. 뮤텍스는 매우 예측할 수 없는 값인 경쟁 조건을 처리하며 시간을 의식하는 스레드의 전환에 의존합니다. 뮤텍스에 대한 예제를 구현하려면 먼저 리포지토리에서 중요하고 필요한 라이브러리를 가져와야 합니다. 필요한 라이브러리는 다음과 같습니다.





$ # 포함

$ # <스레드>를 포함

$ # <뮤텍스>를 포함

'iostream' 라이브러리는 데이터를 Cout으로 표시하고, 데이터를 Cin으로 읽고, 명령문을 endl로 종료하는 기능을 제공합니다. 우리는 '스레드' 라이브러리를 사용하여 스레드의 프로그램이나 기능을 활용합니다. '뮤텍스' 라이브러리를 사용하면 코드에서 뮤텍스 잠금과 잠금 해제를 모두 구현할 수 있습니다. 코드에 포함된 라이브러리와 관련된 모든 프로그램을 허용하기 때문에 '# 포함'을 사용합니다.

이제 이전 단계가 완료되면 std를 사용하여 뮤텍스 클래스 또는 뮤텍스에 대한 전역 변수를 정의합니다. 그런 다음 코드에서 나중에 호출할 수 있는 뮤텍스 잠금 및 잠금 해제를 위한 함수를 만듭니다. 이 예에서는 이 함수의 이름을 블록으로 지정합니다. 블록 함수의 본문에서 먼저 'mutex.lock()'을 호출하고 코드의 논리를 작성하기 시작합니다.



mutex.lock()은 한 번에 하나의 스레드만 우리의 객체를 읽을 수 있도록 생성된 객체 또는 코드에 도달하기 위한 다른 스레드의 액세스를 거부합니다. 논리에서 0에서 9까지의 인덱스에서 실행되는 for 루프를 실행합니다. 루프에 값을 표시합니다. 작업이 완료된 후 또는 논리를 종료한 후 이 논리가 mutex 잠금에 생성되면 'mutex.unlock()' 메서드를 호출합니다. 이 메서드 호출을 사용하면 객체가 하나의 단일 스레드에 액세스할 수 있기 때문에 생성된 객체를 뮤텍스 잠금에서 잠금 해제할 수 있으며 해당 객체에 대한 작업이 한 번에 한 스레드에 의해 완료되면 이제 다른 스레드도 해당 개체 또는 코드에 액세스하기를 원합니다. 그렇지 않으면 코드가 '교착 상태' 상황에서 이동하여 뮤텍스를 사용하여 생성된 객체가 잠긴 상태로 영원히 남아 있고 다른 스레드가 해당 객체에 액세스할 수 없게 됩니다. 따라서 불완전한 작업이 계속 실행됩니다. 그런 다음 블록 기능을 종료하고 메인으로 이동합니다.

기본적으로 'std :: thread thread_name(여기에서 뮤텍스를 생성한 이미 생성된 블록 함수 호출)'을 사용하여 thread1, thread2 및 thread3 등의 이름으로 세 개의 스레드를 생성하여 생성된 뮤텍스를 표시합니다. 이렇게 3개의 스레드가 생성됩니다. 그런 다음 'thread_name.hread_name'을 호출하여 이 세 개의 스레드를 결합하여 동시에 실행합니다. 조인()” 메서드입니다. 그런 다음 0과 같은 값을 반환합니다. 앞서 언급한 예시 설명은 다음 그림과 같은 코드 형태로 구현되어 있습니다.

코드의 출력에서 ​​세 개의 스레드가 하나씩 실행되고 표시되는 것을 볼 수 있습니다. 우리의 애플리케이션이 멀티스레딩 범주에 속하더라도 알 수 있습니다. 그러나 '기능 블록'의 뮤텍스 구현으로 인해 스레드 중 어느 것도 데이터를 덮어쓰거나 수정하지 않았고 수정된 리소스를 공유하지도 않았습니다.

결론

이 가이드는 C++에서 사용되는 뮤텍스 함수의 개념에 대한 자세한 설명을 제공합니다. 우리는 멀티스레딩 애플리케이션이 무엇인지, 멀티스레딩 애플리케이션에서 직면해야 하는 문제가 무엇인지, 멀티스레딩 애플리케이션에 뮤텍스를 구현해야 하는 이유에 대해 논의했습니다. 그런 다음 의사 코드를 사용하는 더미 예제와 함께 뮤텍스 구문에 대해 논의했습니다. 그런 다음 C++ Visual Studio에서 뮤텍스를 사용하여 멀티스레딩 응용 프로그램에 대한 완전한 예제를 구현했습니다.