一个牛B的关于boost::mutex::scoped_lock死锁问题
如下一个代码:
这个实例在正常情况下一定是输出 "foo2"后死锁,但小概率情况会抛出异常
what(): boost::lock_error
百思不得其解下查到这样一则解释:
Checking Locking:试图对本线程已经拥有的mutex加锁会导致boost::lock_error类型的异常抛出。
Unchecking Locking:试图对本线程已经拥有的mutex加锁会导致死锁,快速但不安全。
Unspecified Locking:试图对本线程已经拥有的mutex加锁会导致未定义行为。
而scoped_lock是否属于Unspecified Locking情况?还请牛人赐教!
实在不行只要抛弃使用了,退而使用recursive_mutex递归锁。
...
void foo2() {
boost::mutex::scoped_lock lLock(mtx);
std::cout << "foo2" << std::endl;
boost::mutex::scoped_lock lLock2(mtx);
std::cout << "foo2222222" << std::endl;
}
int main(){
boost::thread thread1(&foo2);
thread1.join();
return 0;
}
...
这个实例在正常情况下一定是输出 "foo2"后死锁,但小概率情况会抛出异常
what(): boost::lock_error
百思不得其解下查到这样一则解释:
Checking Locking:试图对本线程已经拥有的mutex加锁会导致boost::lock_error类型的异常抛出。
Unchecking Locking:试图对本线程已经拥有的mutex加锁会导致死锁,快速但不安全。
Unspecified Locking:试图对本线程已经拥有的mutex加锁会导致未定义行为。
而scoped_lock是否属于Unspecified Locking情况?还请牛人赐教!
实在不行只要抛弃使用了,退而使用recursive_mutex递归锁。
...全文
相关推荐
boost库的线程例子和互斥锁
还有可取消的锁(`boost::mutex::scoped_lock`),当线程被异常终止时,会自动解锁,避免死锁。
C++多线程编程:互斥锁原理、类型与实战避坑指南
在多线程编程中,数据竞争是导致程序行为未定义、计算结果错误甚至崩溃的常见问题。其核心原理在于多个线程未经同步同时读写共享内存区域。为解决这一问题,互斥锁作为一种关键的同步原语应运而生,它通过互斥访问机制确保临界区代码的原子性执行。从技术价值看,互斥锁是构建线程安全、数据一致的高并发程序的基石。在C++工程实践中,标准库提供了多种互斥锁类型以适应不同场景,例如基础的std::mutex、可重入的std::recursive_mutex以及支持超时的std::timed_mutex。合理运用RAII包装器如st
Boost_thread库例程
**线程同步工具**:`boost::lock_guard`和`boost::unique_lock`是智能指针,用于自动管理互斥量的锁定和解锁,避免死锁。
boost::thread编程指南
"这篇文档是关于Boost库中的`boost::thread`模块的编程指南,旨在帮助开发者理解和使用这个强大的多线程工具。Boost是一个致力于推动C++标准库发展的组织,其线程库解决了C++标准
C++ Boost Thread 编程
**互斥锁与条件变量**:提供了多种类型的锁(如互斥锁mutex、读写锁rw_lock)及条件变量,用于控制对共享资源的访问。3.


