互斥体示例和说明
互斥体或互斥对象提供了一种在多线程环境中控制对共享资源的访问的机制。理解它们的操作可能具有挑战性,因为它们的语法乍一看可能违反直觉。
互斥体语法
pthread_mutex_lock(&mutex1) 的语法表明互斥体本身正在被锁定。然而,被锁定的不是互斥锁,而是受其保护的代码区域。这可以防止其他线程在当前线程正在执行代码时访问该代码。
互斥体使用和锁定属性
线程通过观察来确定代码的锁定状态在获取和释放互斥体时建立的内存栅栏。内存栅栏确保一个线程对内存所做的更改及时地对其他线程可见。
临界区
临界区与互斥锁不同。它们仅在 Windows 中可用,并指受互斥锁保护的代码区域。关键部分本身不提供并发访问控制。
最简单的互斥体示例
以下代码演示了互斥体的基本用法:
#include <iostream> #include <thread> #include <mutex> std::mutex m; int i = 0; void makeACallFromPhoneBooth() { m.lock(); std::cout << i << " Hello Wife" << std::endl; i++; m.unlock(); } int main() { std::thread man1(makeACallFromPhoneBooth); std::thread man2(makeACallFromPhoneBooth); std::thread man3(makeACallFromPhoneBooth); man1.join(); man2.join(); man3.join(); return 0; }
互斥类比
为了帮助形象化这个概念,考虑一个电话亭,里面有很多人正在尝试拨打电话。门把手代表互斥锁。只有握住门把手(锁定互斥体)的人才能访问电话(执行受保护的代码)。一旦他们释放门把手(解锁互斥体),另一个人就可以获取它。
通过理解互斥体的概念并有效地使用它们,开发人员可以确保以安全和同步的方式访问共享资源,从而防止多线程环境中的数据损坏和竞争条件。
以上是什么是互斥锁以及它在多线程环境中如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!