【问题标题】:Using a spinlock with c++ openmp在 c++ openmp 中使用自旋锁
【发布时间】: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 继续线程。

标签: c++ openmp spinlock


【解决方案1】:

好吧,如果有人感兴趣,这是我经过反复试验后想出的解决方案,它似乎工作正常。

void Filter::put(Person person)
{
    while (full || omp_test_lock(&spinlock) == 0)
    {
    }
    container[count] = person;
    count++;
    empty = false;
    if (count == 10)
        full = true;
    omp_unset_lock(&spinlock);
}

【讨论】:

  • 可以自行回答,但请务必解释您的代码,而不是提供代码转储。如果您告诉任何对线程编程感兴趣的人“并且它似乎工作正常”,那么这应该足以让他们开始担心,如果他们不会发狂,那就是。哦,你想锁定/挂起线程,而不是让它们循环等待答案。
猜你喜欢
  • 1970-01-01
  • 2017-01-24
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多