运行环境:系统,Dell G3计算机。
多线程同步机制包括:
1. 关键部位
临界区用于实现“独占”。 适用范围是单个进程的线程之间。 这是:
本地对象,而不是核心对象。
快速高效。
不能有多个临界区同时等待。
没有办法检测是否已被线程放弃。
线程之间可以实现互斥,但不能用来实现同步。
2. 信号量
信号量用于跟踪有限的资源。 这是:
核心对象。
没有大师。
可以命名,以便其他进程可以打开它。
它可以被任何线程释放。
它可以实现线程之间的互斥和线程之间的同步。
跨进程使用时,如果拥有信号量的线程意外结束,其他进程将不会得到通知。
3. 互斥
互斥体是一个核心对象,它可以在不同线程之间实现“独占占有”,即使这些线程属于不同的进程。 这是:
核心对象。
如果拥有互斥锁的线程终止,则会生成“已放弃”错误消息。
我可以被命名,这样它就可以被其他进程打开。
只能由拥有它的线程释放。
跨进程使用时,如果持有互斥锁的进程意外结束,其他进程会收到WAIT_消息。
4. 活动
事件对象通常用于重叠输入/输出,或设计一些自定义同步对象。 这是:
核心对象。
但它是用来实现线程的互斥和同步的。
可以命名,以便其他进程可以打开它。
跨进程使用时,如果拥有信号量的线程意外结束,其他进程将不会收到通知。
注意:临界区和互斥体都有“线程所有权”的概念,因此不能用来实现线程间的同步,而只能用来实现互斥。 原因是创建临界区或互斥体的线程可以无条件进入受保护的程序段而无需wait(),因为它有这个权限。 此外,互斥体可以很好地处理放弃操作。 如果线程意外终止而未释放对象,则其他线程可以在 上等待。 但事件和信号量都无法做到这一点。
事件和信号量可以实现线程和进程之间的互斥和同步。
从使用效率上来说,关键区域效率最高,因为它不是内核对象,而其他三个都是核心对象,需要通过操作系统来实现,所以效率比较低。
但如果你想跨进程使用它,你仍然需要互斥体、事件对象和信号量。
简而言之:设计时,一开始就尽量不要使用全局变量。 如果这不起作用,请考虑使用国际米兰。 首先是 () 函数,然后是临界区对象,最后是事件、互斥体和信号量。 以上就是多线程同步机制的详细介绍。 请多关注其他有关PHP知识的相关文章!