【发布时间】:2020-02-02 23:57:06
【问题描述】:
我用唯一锁和条件变量实现了这个方法。它将一个元素添加到数组中,但前提是数组未满。如果已满,它会等待其他线程取出一个元素,然后才将新元素放入。
void Filter::put(Person person)
{
std::unique_lock<std::mutex> guard(lock);
cv.wait(guard, [&] { return !full; });
container[count] = person;
count++;
empty = false;
if (count == 10)
full = true;
cv.notify_all();
}
我的目标是使用 OpenMP 编写相同的方法。如果我理解正确,
#pragma omp critical (name) 应该和唯一锁做同样的事情。但是,我不确定应该如何处理自旋锁。
【问题讨论】:
-
什么自旋锁?您是在谈论
cv.wait(...)电话吗?等待条件变量并不是人们通常所说的“自旋锁”的意思,因为线程在等待条件变量时不使用任何 CPU 周期。 (P.S.,对不起,我无法回答你的问题,因为我不知道 OpenMP。) -
是的,这就是我的意思,抱歉措辞不正确。我正在寻找一种方法来阻止线程并在数组已满时解锁关键部分,然后在有可用空间时使用 OpenMP 继续线程。