c 스레드 동기화 예제

스레드의 동기화가 잘못 될 수있는 방법에 대한 예제를 찾고 있었습니다. 내 프로그래밍 책은 `조심`나에게 말하지만, 내 자신의 콘솔에서 잘못 보고 훨씬 더 재미있다. 당신이 제공 한 코드는 내가 찾고 있던 정확히, 그래서 감사합니다! 적어도 변수증설과 비교하여 뮤텍스를 백만 번 잠그고 잠금을 해제하기 때문에 이 프로세스가 느리게 실행됩니다. (그리고이 간단한 예에서 우리는 정말 스레드가 필요하지 않았다 – 우리는 두 번 추가 할 수 있습니다!) 더 빠른 다중 스레드 예제는 자동 (local) 변수를 사용하여 백만 을 추가한 다음 계산 루프가 완료 된 후에 공유 합계에 추가하는 것입니다 : 나는 모든 면에서 chmurli에 동의해야합니다! 이런 식으로 스레드에 대한 코드를 작성하는 것은 실패일 뿐입니다. 전역 변수는 mutexes에 의해 보호되어야 하는 제한된 리소스에 대한 나쁜 예입니다. 적어도 당신의 선택에 코멘트, 그래서 초보자는 생산 코드에서 이러한 코드를 작성 하는 유혹 하지 않습니다. 전역 변수의 복사본을 스레드 로컬 변수로 보호하는 경우 약간 (여전히 좋지 않은) 더 나은 예가 되었을 것입니다. 스레드 동기화에 mutexes가 사용되는 방법을 보여 주는 예제(고급 참고: 올바른 옵션으로 만들고 공유 메모리 세그먼트를 사용하는 경우 자식과 부모가 뮤텍스를 공유할 수 있도록 하는 공유 메모리를 사용하는 고급 옵션이 있습니다. 스택오버플로우 예제 참조) 편집: 프로세스 간에 리소스를 사용하는 것은 이와 동일한 기본 접근 방식을 따르지만 메모리를 다른 프로세스에 매핑해야 합니다. 다음은 shmem을 사용하는 예입니다: @engeland: 전역 변수를 사용하는 것이 잘못된 경우 인트인트인 이유는 무엇입니까? 프로그래머가 나쁜 관행이라고 해서 뮤텍스로 보호할 수 있는 리소스의 나쁜 예가 아니라는 의미는 아닙니다.

히만슈가 정적 변수를 사용해야 하는가? 그는 할 수 있지만 다음 초보자에게 더 이해할 수있는 코드가 될 것인가? 아니요. 그리고 이것이 예제의 핵심입니다. 가능한 한 간단하게 만드십시오. 다른 한편으로는 전역 변수가 잘못된 프로그래밍 습관이라고 언급되었을 수도 있습니다. @chmurli: 전역 변수와 동일하면 단일 스레드 코드에 대한 주석이 표시됩니다. 이것은 뮤텍스 동기화의 총 단순화입니다. 전체 코드는 중요한 섹션의 일부이므로 보호됩니다. 이 경우는 물론 직렬로 작동합니다. pthread_mutex_lock 전에 또는 pthread_mutex_unlock 후 아무것도 추가하면 좋은 멀티 스레드 프로그램이 있습니다. @Himansu:이 좋은 예주셔서 감사합니다. @engeland “글로벌 변수는 mutexes에 의해 보호되어야하는 제한된 자원에 대한 나쁜 예입니다” 당신은 당신의 문을 정당화하시기 바랍니다 수 있습니까? 실제 문제는 첫 번째 스레드가 사용 중이거나 사용하려고 할 때 두 번째 스레드에 의한 변수 `counter`의 사용이었습니다. 즉, 공유 리소스 `카운터`를 사용하는 동안 스레드 간의 동기화가 부족하여 문제가 발생하거나 한 단어에서 두 스레드 간의 `동기화 문제`로 인해 이 문제가 발생했다고 말할 수 있습니다.

나는이 예제를 읽은 후 스레드, Mutexes에 완전히 새로운, 나는 MUTEX의 기본 및 사용 사례를 얻었다. 이 지식으로, 나는 다른 Mutex 응용 프로그램을 이해할 수 있다고 생각합니다. 위의 예제는 정적으로 선언된 `카운터` 변수를 잘 작동합니다. 나는 gcc를 사용하여 예제를 실행할 때. 나는 이것이 MUTEX가 어떻게 작동하고 opperates를 이해하는 훌륭하고 명확한 예였다, 동의하지 않는다.