위의 예제는 정적으로 선언된 `카운터` 변수를 잘 작동합니다. 나는 gcc를 사용하여 예제를 실행할 때. 상기 코드의 일반적인 출력은 ARGGGH 합계가 8140268이며 경주 조건이 있기 때문에 프로그램이 실행될 때마다 다른 합계가 인쇄됩니다. 코드는 두 스레드가 동시에 읽기 – 쓰기 합계를 중지하지 않습니다. 예를 들어 두 스레드모두 각 스레드를 실행하는 CPU에 sum의 현재 값을 복사합니다(123을 선택해 보겠습니다). 두 스레드 모두 복사본에 대해 하나씩 증분합니다. 두 스레드 모두 값(124)을 다시 씁니다. 스레드가 다른 시간에 합계에 액세스했다면 개수는 125였을 것입니다. 스레드 동기화 문제 동기화 문제를 연구하는 예제 코드 : //: tp_system_using_mutex.c #include #include #include 컴파일: cc-pthread mutex1.c (또는 cc-lpthread mutex1.c) 명시적으로 GNU 컴파일러의 이전 버전에 대 한 라이브러리 참조) 실행: ./a.out 결과: (고급 참고: 하위 및 부모가 올바른 옵션으로 만들고 공유 메모리 세그먼트를 사용하는 경우 자식과 부모가 뮤텍스를 공유할 수 있도록 하는 공유 메모리를 사용하는 고급 옵션이 있습니다. 스택 오버 플로우 예제 참조) @engeland: 왜 전역 변수를 사용 하 여 잘못 된 이 경우? 프로그래머가 나쁜 관행이라고 해서 뮤텍스로 보호할 수 있는 리소스의 나쁜 예가 아니라는 의미는 아닙니다. 히만슈가 정적 변수를 사용해야 하는가? 그는 할 수 있지만 다음 초보자에게 더 이해할 수있는 코드가 될 것인가? 아니요. 그리고 이것이 예제의 핵심입니다.

가능한 한 간단하게 만드십시오. 다른 한편으로는 전역 변수가 잘못된 프로그래밍 습관이라고 언급되었을 수도 있습니다. @chmurli: 전역 변수와 동일하면 단일 스레드 코드에 대한 주석이 표시됩니다. 이것은 뮤텍스 동기화의 총 단순화입니다. 전체 코드는 중요한 섹션의 일부이므로 보호됩니다. 이 경우는 물론 직렬로 작동합니다. pthread_mutex_lock 전에 또는 pthread_mutex_unlock 후 아무것도 추가하면 좋은 멀티 스레드 프로그램이 있습니다. @Himansu:이 좋은 예주셔서 감사합니다. 화장실(공유 리소스)을 방문하기 위해 대기하는 사람(스레드)의 경우 뮤텍스가 무엇인지 에 대한 생생한 설명입니다. 한 사람 (스레드)이 그 / 자신을 완화 화장실을 사용하는 동안 (비 const 비 원자 성 작업), 그 / 그녀는 문이 잠겨 있는지 확인해야합니다 (뮤텍스), 그렇지 않으면 전체 몬티 (원치 않는 행동) pthread_mutex_lock () 및 pthread에 잡힐 수 있습니다 _mutex_trylock() 함수가 실패하는 경우: 적어도 변수증분과 비교하여 뮤텍스를 백만 번 잠그고 잠금을 해제하기 때문에 이 프로세스가 느리게 실행됩니다. (그리고이 간단한 예에서 우리는 정말 스레드가 필요하지 않았다 – 우리는 두 번 추가 할 수 있습니다!) 더 빠른 다중 스레드 예제는 자동(local) 변수를 사용하여 백만 을 추가한 다음 계산 루프가 완료된 후에 공유 합계에 추가하는 것입니다: 뮤텍스 유형이 PTHREAD_MUTEX_DEFAULT인 경우 뮤텍스를 재귀적으로 잠그려고 시도하는 것입니다. 정의되지 않은 동작이 발생합니다.

호출 스레드에 의해 잠겨 있지 않은 경우 뮤텍스의 잠금을 해제하려고 하면 정의되지 않은 동작이 발생합니다. 고정되지 않은 경우 뮤텍스의 잠금을 해제하려고 하면 정의되지 않은 동작이 발생합니다. 이 예제에서는 두 개의 스레드(작업)가 만들어지고 이러한 스레드의 시작 함수에서 시작되고 완료될 때 작업 번호에 대한 로그를 얻기 위해 카운터가 유지됩니다. 뮤텍스 유형이 PTHREAD_MUTEX_RECURSIVE인 경우 뮤텍스는 잠금 수의 개념을 유지합니다.