Linux 멀티스레딩 및 동일한 메모리에 대한 멀티스레드 동시 액세스 문제를 해결하는 방법

WBOY
풀어 주다: 2023-05-17 17:26:23
앞으로
2104명이 탐색했습니다.

멀티스레딩이 왜 필요한가요?

  • 동일한 주소 공간과 사용 가능한 모든 데이터를 공유하는 병렬 엔터티의 이러한 능력은 다중 프로세스 잠금으로 표현할 수 없습니다. 왜냐하면 여러 프로세스가 서로 다른 주소 공간을 갖기 때문입니다.

  • 스레드는 프로세스보다 더 가볍고 빠릅니다.

  • 많은 IO 처리 및 계산이 필요한 경우 멀티 스레드를 사용하면 성능이 크게 향상될 수 있습니다.

  • 멀티 CPU 시스템에서는 멀티 스레딩이 유리합니다. -컴퓨터에서의 스레드 병렬 작업

멀티 스레딩의 장점

  • 처리할 작업이 없으면 프로세서 시간을 다른 작업에 할당할 수 있습니다.

  • 처리 시간이 많이 걸리는 작업은 정기적으로 다른 작업에 프로세서 시간을 할당할 수 있습니다.
  • 언제든지 작업을 중지할 수 있습니다.
  • 각 작업의 우선순위를 별도로 설정하여 최적화할 수 있습니다.
  • 최고의 애플리케이션 시나리오
  • 시간이 많이 걸리거나 프로세서 집약적인 작업은 사용자 인터페이스 작업을 차단합니다.

    각 작업은 외부 리소스(예: 원격 연결 또는 인터넷 연결)를 기다려야 합니다.
  • 멀티스레딩의 단점

  • 대기 공유 리소스를 사용하면 프로그램 실행 속도가 느려집니다. 이러한 공유 리소스는 주로 프린터와 같은 독점 리소스입니다.

스레드를 관리하려면 추가 CPU 오버헤드가 필요합니다.

스레드 교착 상태, 즉 대기 시간이 길어지거나 리소스 경쟁이 심해집니다.

  • 공용 변수를 동시에 읽거나 쓰면 예측할 수 없는 오류가 발생하는 경우가 많습니다.

  • 검증 아이디어

  • 동일한 전역 변수에 5개의 스레드를 사용합니다(초기 값은 0) 함수는 ++ 연산을 수행하고 각 스레드 함수는 ++1000번 수행됩니다. 따라서 우리의 5개 스레드는 ++5000번이고 전역 변수의 최종 값은 5000이 되어야 합니다.
  • 다양한 시도를 수행한 결과 wg 값이 때로는 5000, 때로는 4997 또는 4998인 것으로 확인되었습니다.

  • 이유는 다음과 같습니다.

원자적 연산이 아닌 wg++를 사용합니다. 이는 명령어로 변환됩니다. 컴퓨터에서 실행되는 바이너리 명령어는 변수를 증가시키는 연산을 여러 단계로 나눕니다. 예를 들어 두 개의 스레드가 wg++

을 읽고 있지만 ++는 한 번에 완료할 수 없습니다. 먼저 val을 읽은 다음 ++를 다시 읽습니다. 이 작업은 아직 끝나지 않았습니다. +, 그리고 다시 읽어보세요. 두 스레드가 wg=1;을 추가하는 것이 가능하지만 최종 값은 2입니다.

Linux 멀티스레딩 및 동일한 메모리에 대한 멀티스레드 동시 액세스 문제를 해결하는 방법코드 수준에서만 문제를 고려할 수는 없으며, 코드가 실행되는 환경도 고려해야 합니다. 가상 머신의 설정을 관찰한 결과 4개의 프로세서가 있으며 최소 2개의 프로세서가 처리 중이라는 것을 발견했습니다. 다른 스레드와 스레드가 있는 경우 두 프로세서의 경우 동시에 액세스할 경우 5000 미만이 될 확률이 상대적으로 높으며 이는 병렬 실행으로 인해 발생합니다.

프로세서 하나만 활성화하면 스레드 1개만 실행되고 나머지 4개 스레드는 절대 실행되지 않습니다. 두 스레드가 동시에 실행되는 상황은 없습니다.

5000 미만으로 나타날 확률은 매우 적습니다(이유는 val 값 1을 읽은 후 ++돌아갈 시간이 없었기 때문입니다. 이때 타임 슬라이스가 도착했고 스위치가 다른 스레드로 전환할 때 값은 여전히 ​​1이고, 더하기를 추가하고, 현장 복구를 추가하고, 이 시나리오가 발생할 확률은 매우 낮습니다.) 1개의 프로세서를 병렬화할 수 없습니다.

위 내용은 Linux 멀티스레딩 및 동일한 메모리에 대한 멀티스레드 동시 액세스 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿