뮤텍스 예제 및 연습
멀티 스레드 프로그래밍에서 뮤텍스는 공유 리소스에 대한 액세스를 조정하는 데 중요한 역할을 합니다. 그러나 초보자에게는 그 기능을 이해하는 것이 어려울 수 있습니다. 비유와 예제 프로그램을 사용하여 간단한 설명을 살펴보겠습니다.
유추: 전화 부스
공중 전화 부스가 하나 있는 혼잡한 거리를 상상해 보세요. 여러 사람(스레드)이 전화(공유 리소스)를 사용하고 싶지만 내부에는 한 번에 한 사람만 들어갈 수 있습니다(상호 배제). 혼란을 방지하기 위해 도어 손잡이(뮤텍스)가 설치되어 있습니다.
먼저 부스에 입장한 사람이 손잡이를 잡으면 뮤텍스에 잠금이 설정됩니다. 이는 리소스가 사용 중임을 다른 사람에게 나타냅니다. 사람이 안에 있는 동안에는 손잡이가 잠겨 있기 때문에 다른 사람은 손잡이를 잡을 수 없습니다(상호 배제).
스레드와 뮤텍스 상호 작용
멀티 스레드 프로그램에서 스레드는 다음을 나타냅니다. 우리 비유에 나오는 사람들. 뮤텍스는 공유 리소스에 대한 액세스를 제어하는 변수입니다. 리소스를 보호하려면 스레드는 먼저 다른 스레드가 리소스에 액세스하는 것을 차단하는 뮤텍스 잠금을 획득해야 합니다.
스레드가 잠금을 획득하면 해당 리소스에 독점적으로 액세스할 수 있습니다. 완료되면 잠금을 해제하여 다른 스레드가 잠금을 획득할 수 있도록 합니다. 이렇게 하면 공유 리소스에 대한 동시 액세스가 방지되어 데이터 손상이 발생할 수 있습니다.
예제 프로그램
다음은 뮤텍스 작동 방식을 보여주는 간단한 C 11 예입니다.
#include <iostream> #include <thread> #include <mutex> std::mutex m; int i = 0; void makeACallFromPhoneBooth() { m.lock(); std::cout << i << " Hello Wife" << std::endl; i++; m.unlock(); } int main() { std::thread man1(makeACallFromPhoneBooth); std::thread man2(makeACallFromPhoneBooth); std::thread man3(makeACallFromPhoneBooth); man1.join(); man2.join(); man3.join(); }
이 예에서는 변수 m이 뮤텍스 역할을 합니다. 이는 한 번에 하나의 스레드만 공유 변수 i를 사용할 수 있도록 보장합니다. 뮤텍스가 없으면 여러 스레드가 i를 동시에 수정하여 부정확한 결과를 초래할 수 있습니다.
잠금 구문
pthread_mutex_lock(&mutex1) 구문은 뮤텍스에 대한 잠금을 획득합니다. mutex1이라는 이름이 붙었습니다. 이는 뮤텍스로 보호되는 코드 영역이 현재 잠겨 있음을 다른 스레드에 알립니다.
스레드는 잠금이 유지되는 동안 액세스를 방지할 수 있도록 잠긴 영역에 대해 알아야 합니다. 스레드가 잠긴 영역에 액세스하려고 하면 잠금이 해제될 때까지 차단됩니다.
결론
뮤텍스는 멀티스레드 프로그래밍에서 필수적인 메커니즘으로, 공유를 보장합니다. 리소스는 제어되고 동기화된 방식으로 액세스됩니다. 데이터 손상을 방지하고 효율적인 멀티스레딩을 달성하려면 해당 기능을 이해하는 것이 중요합니다.
위 내용은 뮤텍스는 다중 스레드 프로그램에서 데이터 손상을 어떻게 방지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!