当我在已经锁定的pthread_mutex_t上执行pthread_mutex_init时会发生什么
What happens when I do a pthread_mutex_init on an already locked pthread_mutex_t?
我的互斥类被定义:-
class Mutex{
static pthread_mutex_t mutex;
public:
Mutex(){
pthread_mutex_init(&mutex, NULL);
while(pthread_mutex_trylock(&mutex)){
sleep(2000);
}
}
virtual ~Mutex(){
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
}
};
我正在尝试应用互斥来像这样使用此类的函数:-
void doSomething(){
Mutex mutex;
// do something
}
这样,当调用构造函数时,将初始化互斥锁,并尝试获取该互斥锁上的锁。当它超出该功能的范围时,它会自动被销毁。
但是,如果一个线程锁定了互斥锁,另一个线程尝试在其上运行pthread_mutex_init
,究竟会发生什么?具有锁的线程会被覆盖吗?
非常简单,从POSIX.1-2013:
尝试初始化已初始化的互斥锁会导致未定义的行为。
这就是为什么您有另一种初始化互斥体的方法:
// in your .cpp somewhere
pthread_mutex_t Mutex::mutex = PTHREAD_MUTEX_INITIALIZER;
除此之外,从逻辑上讲,你的班级似乎很可疑。您是否真的希望为Mutex
的所有用户使用一个全局锁,无论他们在做什么?您应该使用细粒度锁,否则您将通过软件锁定人为地限制自己的可扩展性。
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- std::mutex 如何防止线程修改?
- 在 c++11 中为 pthread 设置调度参数
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- pthread只有在线程数量较少时才可以正常工作
- std::atomic 和 std::mutex 的相对性能
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- pthread执行时间比顺序执行时间差
- 使用 -pthread 如何不违反 ODR 规则?
- 使用 pthread 的多线程
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- 当"std::lock_guard<std::mutex>"对象没有名称时的不同行为
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 使用 std::mutex 保护环路
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 在哪里放置pthread Mutex和con var,以确保激活所有功能
- 在Windows中使用PTHREAD的Mutex
- PThread Mutex Lock & Unlock on Stack