C++ lock_guard 与 mutex.lock()
C++ lock_guard vs mutex.lock()
我有一个这样的循环:
for (auto &i : elements)
{
std::lock_guard<std::mutex> lock(i.mutex);
some heavy writing to disk with i
}
抛出错误:
tpp.c:62: __pthread_tpp_change_priority: Assertion `new_prio == -1 || (new_prio >= __sched_fifo_min_prio && new_prio <= __sched_fifo_max_prio)' failed.
谁能解释一下,为什么这个循环不抛出错误:
for (auto &i : elements)
{
i.mutex.lock();
some heavy writing to disk with i
i.mutex.unlock();
}
我对 C++ 多线程的了解更多是从实践的角度来看的,所以两个循环对我来说总是一样的。但是,第一个给我带来的问题比第二个多得多。它也不总是相同的错误,我在循环 #1 中也得到了一些无效指针,而第二个循环在多次运行中尚未崩溃。
任何猜测,在不知道其余代码的情况下可能导致问题的原因是什么?
tpp.c:63: __pthread_tpp_change_priority: Assertion
是一个已知问题并且 solved:
简而言之,问题是由快速互斥锁重复锁定引起的,使用递归互斥锁解决,默认pthread_mutex_t是不递归的。是否有可能 pthread_mutex_t 深入线程 运行 代码?
顺便说一句,要使互斥锁递归,请使用 PTHREAD_MUTEX_RECURSIVE_NP.
属性设置互斥锁属性
好的,我想我找到了答案。感谢大家解决问题。 @molbdnilo 最接近问题。事实上,我的其余代码中存在未定义的行为。 运行 Valgrind 向我显示了 lock_guard 上的无效读写操作。我的互斥量存储在一个共享指针中,该指针正在被另一个线程重置,而无需事先锁定。因此,互斥锁被销毁,而另一个线程在其上持有 lock_guard 。我猜这是个问题?
在循环 #2 中,实际情况是 i->mutex.lock() 和 i->mutex.unlock()。所以这里没有抛出任何错误,可能是因为第一个锁有时只是发生在一个对象上,这个对象很快就会被释放。然后在一个已经解锁的互斥锁上调用解锁,这也是未定义的行为,但目前没有导致任何错误。
我有一个这样的循环:
for (auto &i : elements)
{
std::lock_guard<std::mutex> lock(i.mutex);
some heavy writing to disk with i
}
抛出错误:
tpp.c:62: __pthread_tpp_change_priority: Assertion `new_prio == -1 || (new_prio >= __sched_fifo_min_prio && new_prio <= __sched_fifo_max_prio)' failed.
谁能解释一下,为什么这个循环不抛出错误:
for (auto &i : elements)
{
i.mutex.lock();
some heavy writing to disk with i
i.mutex.unlock();
}
我对 C++ 多线程的了解更多是从实践的角度来看的,所以两个循环对我来说总是一样的。但是,第一个给我带来的问题比第二个多得多。它也不总是相同的错误,我在循环 #1 中也得到了一些无效指针,而第二个循环在多次运行中尚未崩溃。
任何猜测,在不知道其余代码的情况下可能导致问题的原因是什么?
tpp.c:63: __pthread_tpp_change_priority: Assertion
是一个已知问题并且 solved:
简而言之,问题是由快速互斥锁重复锁定引起的,使用递归互斥锁解决,默认pthread_mutex_t是不递归的。是否有可能 pthread_mutex_t 深入线程 运行 代码? 顺便说一句,要使互斥锁递归,请使用 PTHREAD_MUTEX_RECURSIVE_NP.
属性设置互斥锁属性好的,我想我找到了答案。感谢大家解决问题。 @molbdnilo 最接近问题。事实上,我的其余代码中存在未定义的行为。 运行 Valgrind 向我显示了 lock_guard 上的无效读写操作。我的互斥量存储在一个共享指针中,该指针正在被另一个线程重置,而无需事先锁定。因此,互斥锁被销毁,而另一个线程在其上持有 lock_guard 。我猜这是个问题?
在循环 #2 中,实际情况是 i->mutex.lock() 和 i->mutex.unlock()。所以这里没有抛出任何错误,可能是因为第一个锁有时只是发生在一个对象上,这个对象很快就会被释放。然后在一个已经解锁的互斥锁上调用解锁,这也是未定义的行为,但目前没有导致任何错误。