iOS 의 스 레 드 잠 금 인 스 턴 스 상세 설명
두 개 또는 두 개 이상 의 스 레 드 가 실행 과정 에서 자원 쟁탈 로 인해 서로 기다 리 는 현상 을 말 하 는데 외력 작용 이 없 으 면 추진 할 수 없다.
스 레 드 잠 금 은 어떻게 발생 합 니까?
자물쇠 가 꺼 지 는 경 우 는 일반적으로 두 대상 의 자물쇠 가 서로 기다 리 면서 생 긴 것 이다.
잠 금 발생 조건
1.상호 배척 조건:상호 배척 이란 과정 이 특정한 시간 안에 자원 을 독점 하 는 것 이다.
2.요청 과 유지 조건:한 프로 세 스 가 요청 자원 으로 인해 막 혔 을 때 얻 은 자원 을 놓 지 않 습 니 다.
3.조건 을 박탈 하지 않 습 니 다:프로 세 스 가 자원 을 얻 었 습 니 다.마지막 에 사용 하기 전에 강제로 박탈 할 수 없습니다.
4.순환 대기 조건:여러 프로 세 스 간 에 머리 와 꼬리 가 연결 되 는 순환 대기 자원 관 계 를 형성한다.
잠 금 은 보통 하나의 스 레 드 로 자원 A 를 잠 그 고 자원 B 를 잠 그 려 고 합 니 다.다른 스 레 드 에서 자원 B 를 잠 그 고 자원 A 를 잠 그 고 자신의 작업 을 완성 하려 고 합 니 다.두 스 레 드 는 모두 상대방 의 자원 을 얻 고 싶 지만 자신의 자원 을 방출 하지 않 아서 두 스 레 드 가 서로 기다 리 고 있어 서 실행 할 수 없 는 상황 을 초래 합 니 다.
스 레 드 잠 금 이 발생 하 는 원인:직렬 대기 열 작업 에서 이 대기 열 에 동기 화 작업 을 추가 합 니 다.
전형 적 인 예:
우리 분석 해 보 자.
홈 팀 열 mainqueue 는 직렬 대기 열 입 니 다.직렬 대기 열의 특징 은 대기 열 에 있 는 모든 작업 을 순서대로 수행 해 야 한 다 는 것 입 니 다.대기 열 에 추 가 된 선착순 으로 실행 해 야 한 다 는 것 이다.
우 리 는 그림 을 한 장 더 보 았 다.
우 리 는 코드 에서
dispatch_sync()
함 수 를 사용 하여 홈 팀 열 에 동기 화 작업 을 추가 했다.
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@" ");
});
}
즉,추 가 된 동기 화 작업 5 는 viewdLoad 작업 2 이후 작업 2 가 실 행 된 후에 만 작업 5 를 수행 할 수 있 는 것 이 직렬 대기 열의 특징 이다.그러나 퀘 스 트 5 는 동기 화 퀘 스 트 로 퀘 스 트 5 가 완 료 될 때 까지 기 다 려 야 다른 퀘 스 트 를 수행 할 수 있 기 때문에 서로 기다 리 는 자물쇠 가 생 긴 다.예 를 하나 더 보다.
우 리 는 GCD 가 동기 화 작업 과 비동기 작업 으로 나 뉘 는 것 을 알 고 있 습 니 다.처음에 예 는 메 인 스 레 드 의 홈 팀 열 이 었 고 동기 화 작업 에 해당 합 니 다.이 예 는 비동기 작업 에서 도 작업 대기 열 이 직렬 대기 열 이 라면 직렬 대기 열 작업 에서 대기 열 에 동기 화 작업 을 추가 하면 잠 금 이 사라 집 니 다.관건 은 동기 화 또는 비동기 가 아니 라 직렬 대기 열 입 니 다.
총결산
dispatch_sync()함수 가 스 레 드 를 막 습 니 다.현재 대기 열 은 직렬 대기 열 입 니 다.작업 은 순서대로 수행 해 야 합 니 다.직렬 대기 열의 퀘 스 트 A 에 동기 화 퀘 스 트 B 를 추가 하 는 것 은 이 직렬 대기 열 에 또 하나의 퀘 스 트 B 가 추가 되 었 다 는 것 과 같 습 니 다.퀘 스 트 B 를 수행 하려 면 퀘 스 트 A 가 완 료 될 때 까지 기 다 려 야 하지만 퀘 스 트 B 는 동기 화 퀘 스 트 입 니 다.퀘 스 트 B 가 완 료 될 때 까지 기 다 려 야 다른 임 무 를 수행 할 수 있 기 때문에 퀘 스 트 AB 는 서로 기 다 려 서 잠 금 을 만 듭 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.