当前位置: 首页 > 知识库问答 >
问题:

是condition_variable。通知同步点?

凌和颂
2023-03-14
bool signalled = false;
std::condition_variable cv;
void thread1() {
  while (true) {
    std::unique_lock l(mutex);
    cv.wait_until(l, [] { return signalled; });
    return;
  }
}

void thread2...N() {
  signalled = true;
  cv.notify_all();
}

编辑:如果不是线程安全的,我正在寻找一个关于竞争条件的描述,这样我就可以更好地理解潜在的问题并填补知识空白。

共有1个答案

吴德辉
2023-03-14

在不同步的情况下写入非原子变量是ub。但是,使signaled成为原子 并不能解决问题。

std::condition_variable上的C++引用读取:

即使共享变量是原子变量,也必须在互斥体下对其进行修改,以便将修改正确地发布到等待线程。

bool signalled = false;

void thread2...N()
{
    std::unique_lock l(mutex);
    signalled = true;
    cv.notify_all();
}
    null
 类似资料:
  • 问题内容: 如果我仅使用同步而不是等待/通知方法,它将仍然保持线程安全吗? 有什么不同 ? 提前谢谢。 问题答案: 使用使方法/块一次只能在线程上访问。因此,是的,它是线程安全的。 这两个概念是结合在一起的,而不是相互排斥的。使用时,您需要在该对象上拥有监视器。所以您需要在此之前。使用使当前线程停止,直到另一个线程在其等待的对象上调用。这是对的补充,它仅确保仅一个线程将进入块/方法。

  • 我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。 他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下: 如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。 虽然它是同步运行的,

  • 我对Java同步()块的理解是,如果一个线程已经拥有一个对象上的锁,它可以进入一个在同一个对象上同步的不同块(重入同步)。下面,我相信JVM使用引用计数来增加/减少线程获得锁的次数,并且锁只有在计数为零时才会释放。 所以我的问题是,如果你遇到这样的代码: 当调用etc()时,具体会发生什么?它仅仅是减少计数,还是不顾计数释放锁? 在第一种情况下,在我看来,如果发生了锁重新进入,它将产生死锁,因为它

  • Java问题: 自动退出同步块不会notifyAll()。这是预期的行为吗? 我已经测试过了,它似乎是 1。当执行脱离同步块时,它会自动通知All() 2。当方法本身被同步时,它会在返回时自动通知()。( 不通知全部() ) 代码: 输出: [2] :检查锁是否可用… [2]:获得了锁 [1]:检查锁是否可用… [2]:正在等待锁… 1]:获得了锁 [1]:正在等待锁定。 MyThread正在尝试

  • 问题内容: 据我所知,并已替换为更好的并发机制。那么,对于实现同步队列,您会选择哪种更好的替代方法呢? 它们究竟在什么意义上“更好”? 编辑 :这(“实现同步队列”)是一个采访问题。可接受的答案不能使用BlockingQueue或其他队列实现。但是,它可能使用其他同步构造,例如CountDownLatch。我没有允许和禁止的类的详尽列表- 请您注意。 问题答案: 已被Lock类方法和Conditi