【发布时间】:2020-10-27 09:38:28
【问题描述】:
我有一个这样的循环:
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 指针,而第二个循环在许多运行中还没有崩溃。
任何猜测,在不知道其余代码的情况下可能导致问题的原因是什么?
【问题讨论】:
-
问题很可能出在您的其余代码中。某处有未定义的行为,无法猜测是什么或在哪里。
-
但是这不是很奇怪吗,它使用循环#1 在几秒钟内崩溃,但使用循环#2 根本没有崩溃?它说明了其余代码中的错误是什么?一些内存管理不善,因此创建 lock_guard 会导致问题,就像创建任何对象一样?
-
未定义的行为有时很奇怪,有时它似乎有效。它还可能影响程序中明显不相关的部分。找到它的最有效方法是假设任何事情都可能出错,仔细阅读并更仔细地思考。
-
尝试改用
std::unique_lock
标签: c++ multithreading locking mutex