>  기사  >  다중 스레드 동기화 메커니즘에는 무엇이 포함됩니까?

다중 스레드 동기화 메커니즘에는 무엇이 포함됩니까?

coldplay.xixi
coldplay.xixi원래의
2021-01-07 15:24:197488검색

다중 스레드 동기화 메커니즘에는 다음이 포함됩니다. 1. "독점적 소유"를 달성하는 데 사용되는 중요 섹션 2. 제한된 리소스를 추적하는 데 사용되는 세마포 3. 서로 다른 스레드 간에 구현될 수 있는 뮤텍스 "독점적 소유" 해당 스레드는 서로 다른 프로세스에 속합니다. 4. 이벤트는 일반적으로 중첩된 I/O에 사용되거나 일부 사용자 정의 동기화 개체를 설계하는 데 사용됩니다.

다중 스레드 동기화 메커니즘에는 무엇이 포함됩니까?

이 문서의 운영 환경: Windows 7 시스템, Dell G3 컴퓨터.

다중 스레드 동기화 메커니즘에는 다음이 포함됩니다.

1. Critical SectionCritical Section

Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程的各线程之间。它是:

  •  一个局部性对象,不是一个核心对象。

  •  快速而有效率。

  •  不能够同时有一个以上的 critical section 被等待。

  •  无法侦测是否已被某个线程放弃。

  • 可以实现线程间互斥,不能用来实现同步。

2、Semaphore

Semaphore 被用来追踪有限的资源。它是:

  • 一个核心对象。

  •  没有拥有者。

  •  可以具名,因此可以被其他进程开启。

  •  可以被任何一个线程释放(released)。

  • 既能实现线程间互斥,也能实现线程间同步。

  • 在跨进程中使用时,如果拥有信号量的线程意外结束,其它进程不会收到通知。

3、Mutex

Mutex 是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至即使那些线程分属不同进程。它是:

  • 一个核心对象。

  •  如果拥有 mutex 的那个线程结束,则会产生一个 “abandoned” 错误信息。

  • i可以具名,因此可以被其他进程开启。

  • 只能被拥有它的那个线程释放(released)。

  • 在跨进程中使用时,如果拥有互斥器的进程意外结束,其它进程会收到一个WAIT_ABANDOEND消息。

4、Event

Event object 通常使用于 overlapped I/O,或用来设计某些自定义的同步对象。它是:

  •  一个核心对象。

  • 可是用来实现线程的互斥与同步。

  • 可以具名,因此可以被其他进程开启。

  • 在跨进程中使用时,如果拥有信号量的线程意外结束,其它进程也不会受到通知。

注意:临界区和互斥器都有“线程所有权”的概念,所以它们是不能用来实现线程间的同步的,只能用来实现互斥。原因是由于创建临界区或互斥器的线程可以不用等待LeaveCriticalSection()SetEvent()就可以无条件进入保护的程序段,因为它拥有这个权利。另外,互斥器可以很好的处理”遗弃“操作。若线程在未释放对向象的时候就意外终止的,其它线程可以等待到一个WAIT_ABANDONED_0

Critical section(Critical section)은 "독점적 소유"를 달성하는 데 사용됩니다. 적용 범위는 단일 프로세스의 스레드 사이입니다.

  • 핵심 개체가 아닌 로컬 개체입니다.

  • 빠르고 효율적입니다.

  • 동시에 두 개 이상의 중요한 섹션을 기다릴 수 없습니다.

  • 스레드에 의해 중단되었는지 여부를 감지할 수 없습니다. 🎜
  • 🎜스레드 간 상호 배제를 달성할 수 있지만 동기화를 달성하는 데 사용할 수는 없습니다. 🎜
🎜2. 세마포어🎜🎜세마포어는 제한된 리소스를 추적하는 데 사용됩니다. 🎜
  • 🎜핵심 개체입니다. 🎜
  • 🎜 주인이 없습니다. 🎜
  • 🎜 이름을 지정할 수 있으므로 다른 프로세스에서 열 수 있습니다. 🎜
  • 🎜 어떤 스레드로든 공개할 수 있습니다. 🎜
  • 🎜스레드 간 상호 배제와 쓰레드 간 동기화를 실현할 수 있습니다. 🎜
  • 🎜프로세스 간에 사용할 때 세마포어를 소유한 스레드가 예기치 않게 종료되면 다른 프로세스에 알리지 않습니다. 🎜
🎜3. Mutex🎜🎜Mutex는 해당 스레드가 다른 프로세스에 속하더라도 서로 다른 스레드 간에 "독점적 소유"를 달성할 수 있는 핵심 개체입니다. 🎜
  • 🎜핵심 개체입니다. 🎜
  • 🎜 뮤텍스를 소유한 스레드가 종료되면 "포기됨" 오류 메시지가 생성됩니다. 🎜
  • 🎜i에는 이름을 지정할 수 있으므로 다른 프로세스에서 열 수 있습니다. 🎜
  • 🎜 이를 소유한 스레드에 의해서만 해제될 수 있습니다. 🎜
  • 🎜프로세스 간에 사용될 때 뮤텍스를 소유한 프로세스가 예기치 않게 종료되면 다른 프로세스는 WAIT_ABANDOEND 메시지를 받게 됩니다. 🎜
🎜4. 이벤트🎜🎜이벤트 개체는 일반적으로 중첩된 I/O에 사용되거나 일부 사용자 정의 동기화 개체를 설계하는 데 사용됩니다. 🎜
  • 🎜 핵심 개체입니다. 🎜
  • 🎜스레드의 상호 배제 및 동기화를 달성하는 데 사용됩니다. 🎜
  • 🎜이름을 지정할 수 있으므로 다른 프로세스에서 열 수 있습니다. 🎜
  • 🎜프로세스 간에 사용할 때 세마포어를 소유한 스레드가 예기치 않게 종료되면 다른 프로세스에 알리지 않습니다. 🎜
🎜참고: 중요 섹션과 뮤텍스는 모두 "스레드 소유권" 개념을 가지므로 스레드 간 동기화를 달성하는 데 사용할 수 없고 상호 배제를 구현하는 데만 사용할 수 있습니다. 그 이유는 크리티컬 섹션이나 뮤텍스를 생성한 스레드가 이 권한을 갖고 있기 때문에 LeaveCriticalSection(), SetEvent()를 기다리지 않고 무조건 보호된 프로그램 섹션에 진입할 수 있기 때문입니다. 또한 뮤텍스는 "포기" 작업을 매우 잘 처리할 수 있습니다. 객체를 해제하지 않고 스레드가 예기치 않게 종료되면 다른 스레드는 WAIT_ABANDONED_0을 기다릴 수 있습니다. 하지만 이벤트나 세마포어 모두 그렇게 할 수 없습니다. 🎜🎜이벤트와 세마포어 모두 스레드와 프로세스 간의 상호 배제 및 동기화를 달성할 수 있습니다. 🎜🎜사용 효율성 측면에서 보면 임계 섹션은 커널 개체가 아니기 때문에 효율성이 가장 높으며, 나머지 3개는 운영 체제의 도움을 받아 구현해야 하므로 효율성이 상대적으로 낮습니다. 낮은. 🎜🎜그러나 프로세스 전반에 걸쳐 사용하려면 뮤텍스, 이벤트 개체 및 세마포어를 사용해야 합니다. 🎜🎜간단히 말하면, 디자인할 때 전역 변수를 먼저 사용하지 마십시오. 그렇지 않은 경우 Inter...() 함수를 먼저 사용한 다음 임계 섹션 객체, 마지막으로 이벤트, 뮤텍스 및 세마포를 사용하는 것을 고려하십시오. 🎜

위 내용은 다중 스레드 동기화 메커니즘에는 무엇이 포함됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.