다중 스레드 동기화 메커니즘에는 다음이 포함됩니다. 1. "독점적 소유"를 달성하는 데 사용되는 중요 섹션 2. 제한된 리소스를 추적하는 데 사용되는 세마포 3. 서로 다른 스레드 간에 구현될 수 있는 뮤텍스 "독점적 소유" 해당 스레드는 서로 다른 프로세스에 속합니다. 4. 이벤트는 일반적으로 중첩된 I/O에 사용되거나 일부 사용자 정의 동기화 개체를 설계하는 데 사용됩니다.
이 문서의 운영 환경: Windows 7 시스템, Dell G3 컴퓨터.
다중 스레드 동기화 메커니즘에는 다음이 포함됩니다.
1. Critical Section
Critical 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
세마포어
🎜🎜세마포어는 제한된 리소스를 추적하는 데 사용됩니다. 🎜Mutex
🎜🎜Mutex는 해당 스레드가 다른 프로세스에 속하더라도 서로 다른 스레드 간에 "독점적 소유"를 달성할 수 있는 핵심 개체입니다. 🎜WAIT_ABANDOEND
메시지를 받게 됩니다. 🎜이벤트
🎜🎜이벤트 개체는 일반적으로 중첩된 I/O에 사용되거나 일부 사용자 정의 동기화 개체를 설계하는 데 사용됩니다. 🎜LeaveCriticalSection()
, SetEvent()
를 기다리지 않고 무조건 보호된 프로그램 섹션에 진입할 수 있기 때문입니다. 또한 뮤텍스는 "포기" 작업을 매우 잘 처리할 수 있습니다. 객체를 해제하지 않고 스레드가 예기치 않게 종료되면 다른 스레드는 WAIT_ABANDONED_0
을 기다릴 수 있습니다. 하지만 이벤트나 세마포어 모두 그렇게 할 수 없습니다. 🎜🎜이벤트와 세마포어 모두 스레드와 프로세스 간의 상호 배제 및 동기화를 달성할 수 있습니다. 🎜🎜사용 효율성 측면에서 보면 임계 섹션은 커널 개체가 아니기 때문에 효율성이 가장 높으며, 나머지 3개는 운영 체제의 도움을 받아 구현해야 하므로 효율성이 상대적으로 낮습니다. 낮은. 🎜🎜그러나 프로세스 전반에 걸쳐 사용하려면 뮤텍스, 이벤트 개체 및 세마포어를 사용해야 합니다. 🎜🎜간단히 말하면, 디자인할 때 전역 변수를 먼저 사용하지 마십시오. 그렇지 않은 경우 Inter...() 함수를 먼저 사용한 다음 임계 섹션 객체, 마지막으로 이벤트, 뮤텍스 및 세마포를 사용하는 것을 고려하십시오. 🎜위 내용은 다중 스레드 동기화 메커니즘에는 무엇이 포함됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!