Mutex

Mutex 作为系统核心对象是可以跨进程的(临界区就不行), 我们可以利用互斥对象禁止程序重复启动.

工作思路:
先用 OpenMutex 尝试打开一个自定义名称的 Mutex 对象, 如果打开失败说明之前没有这个对象存在;
如果之前没有这个对象, 马上用 CreateMutex 建立一个, 此时的程序应该是第一次启动;
再重复启动时, 那个 OpenMutex 就有结果了, 然后强制退出.
最后在程序结束时用 CloseHandle 释放 Mutex 对象.
### C++ 中 Mutex 的使用与示例 在多线程环境中,`std::mutex` 是 C++11 引入的一个同步机制,用于保护共享资源,防止多个线程同时访问导致的数据竞争问题。以下是对 `std::mutex` 的详细介绍和使用示例。 #### 什么是 `std::mutex`? `std::mutex` 是一个互斥锁,允许多个线程对共享资源进行互斥访问。当一个线程锁定了一个 `std::mutex`,其他试图锁定同一个 `std::mutex` 的线程将被阻塞,直到该 `std::mutex` 被解锁[^1]。 #### 基本用法 `std::mutex` 的基本操作包括: - **构造函数**:创建一个未锁定的互斥锁。 - **lock()**:显式地锁定互斥锁。如果互斥锁已经被其他线程锁定,则当前线程会被阻塞。 - **unlock()**:解锁互斥锁。 - **try_lock()**:尝试锁定互斥锁。如果互斥锁已被锁定,则返回 `false` 而不会阻塞当前线程。 为了防止因异常导致忘记解锁的问题,推荐使用 RAII(Resource Acquisition Is Initialization)风格的锁管理工具,如 `std::lock_guard` 或 `std::unique_lock`。 #### 示例代码 以下是一个简单的示例,展示如何使用 `std::mutex` 来保护共享资源: ```cpp #include <iostream> #include <thread> #include <vector> #include <mutex> std::mutex mtx; // 定义一个全局互斥锁 void print_block(int n, char c) { std::lock_guard<std::mutex> lock(mtx); // 使用 lock_guard 自动管理锁 for (int i = 0; i < n; ++i) { std::cout << c; } std::cout << '\n'; } int main() { std::vector<std::thread> threads; for (int i = 0; i < 10; ++i) { threads.emplace_back(print_block, 5, 'a' + i % 3); } for (auto& th : threads) { th.join(); } return 0; } ``` 在上述代码中,`std::lock_guard<std::mutex>` 确保了即使在异常情况下,互斥锁也会被正确释放[^1]。 #### 解决死锁问题 死锁是指两个或多个线程互相等待对方释放资源的情况。为避免死锁,可以使用 `std::scoped_lock` 或者明确的锁顺序策略。例如: ```cpp #include <iostream> #include <thread> #include <mutex> std::mutex m1, m2; void thread_function(bool reverse_order) { if (reverse_order) { std::lock_guard<std::mutex> guard1(m2); // 锁定 m2 std::lock_guard<std::mutex> guard2(m1); // 锁定 m1 std::cout << "Locked in reverse order\n"; } else { std::lock_guard<std::mutex> guard1(m1); // 锁定 m1 std::lock_guard<std::mutex> guard2(m2); // 锁定 m2 std::cout << "Locked in normal order\n"; } } int main() { std::thread t1(thread_function, false); std::thread t2(thread_function, true); t1.join(); t2.join(); return 0; } ``` 在这个例子中,通过确保所有线程以相同的顺序锁定互斥锁,可以有效避免死锁的发生[^1]。 #### 其他相关工具 除了 `std::mutex`,C++ 标准库还提供了其他同步工具: - **std::recursive_mutex**:允许同一线程多次锁定同一互斥锁。 - **std::timed_mutex**:支持带超时的锁定操作。 - **std::shared_mutex**:允许多个线程同时读取共享资源,但只允许一个线程写入。 #### 注意事项 - 在多线程程序中,尽量减少锁定时间,以提高并发性能。 - 避免在锁定期间调用可能抛出异常的代码,否则可能导致资源泄漏。 - 使用 RAII 风格的锁管理工具(如 `std::lock_guard` 或 `std::unique_lock`),可以简化代码并降低出错概率[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值