问题标签 [unique-lock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3767 浏览

c++ - 将互斥引用从主传递到类

我需要在主函数和类实例中mutex使用相同的内容。unique_lock但是,我无法将mutex/unique_lock地址分配给类成员变量(即 a mutex&)。

这就是我所拥有的:

工人.h

工人.cpp

我试着做this->mu(mu);但这也不起作用。我能做些什么来完成这项工作吗?

谢谢。

0 投票
1 回答
169 浏览

c++ - 为什么 std::lock() 在使用我自己的 unique_lock 对象时会导致无限循环?

我正在尝试实现 unique_lock 的模拟(它只是研究任务,我了解标准库实现完美无缺)。

我已经编写了我需要的所有方法,现在我正在尝试在https://en.cppreference.com/w/cpp/thread/unique_lock/unique_lock的示例上测试我的代码。

当谈到 std::lock(lk_b, lk_c); 无限循环开始。

我做了一些 cout 来了解程序在哪里失去控制,结果如下:锁定 -> 尝试 -> 解锁 -> 锁定 -> 尝试 -> 解锁。

这是部分 unique_lock 实现(我只包括了那些在示例的问题部分中使用的方法)。

这是一个例子。

所以,正如我所说,我真的不明白为什么 lock() 会通过这样的调用链(lock -> try_lock -> unlocked)导致无限循环。

0 投票
1 回答
57 浏览

c++ - dtor 中的这个 unique_lock 是否有任何用途?

在我正在调试的代码库中遇到了这个析构函数。

它实际上在多线程程序中有什么有用的用途吗?它看起来像kludge。

我假设这个想法是如果另一个线程正在调用一个锁定互斥锁的函数,则推迟销毁,但这样做是否有效?ElectricFence 段错误会让我不相信。

0 投票
0 回答
83 浏览

c++ - C++ 中的适配器模式使用私有和公共继承的混合

我有一个关于创建锁适配器的问题,更一般地说是具有以下实现风格的适配器模式。下面的实现基于 Proper C++ way of implementation a lock_guard for custom library中的答案。实现依赖于新接口(在本例中为类)的公共继承和旧接口的私有继承。然而,似乎没有一种将lock_adapter 传递给unique_lock 的干净方法,即因为adapted_unique_lock不是作者可能想要的lock_adapter,即这不会编译。

对于这个特定的实例,做一些简单的事情而不是像下面这样直接适应unique_lock。

我的问题是,是否有一种方法可以获得使用私有和公共继承混合工作的原始实现,这需要将私有基类传递到公共基类中?

0 投票
1 回答
76 浏览

c++ - 使用 lock_guard 采用的互斥锁可以导致 UB 吗?

由于使用已被 a 采用的互斥锁的锁,以下代码段是否会导致未污染的行为 a lock_guard?如果我在同一个片段中使用unique_lock而不是它会安全吗?lock_guard我知道有std::unique_lock<T>::lock/unlock()

0 投票
0 回答
68 浏览

multithreading - 我的线程安全队列代码似乎可以工作,是否存在任何可能的竞争条件、死锁或其他设计问题?

我是在 C++中使用condition_variables 和s 的新手。unique_lock我正在创建一个事件循环,该循环轮询两个自定义事件队列和一个“布尔值”(请参阅​​作为布尔值的整数),可以由多个来源对其进行操作。

我有一个似乎可以工作的演示(如下),如果您可以查看并确认它是否遵循使用unique_lockcondition_variables 的最佳实践以及您预见到的任何问题(竞争条件、线程阻塞等),我将不胜感激。

  1. 我们ThreadSafeQueue::enqueue(...):是否通过调用 notify 并让 unique_lock 超出范围来解锁两次?

  2. 在方法中TheadSafeQueue::dequeueAll():我们假设它被一个已通知(cond.notify)的方法调用,因此已被锁定。有没有更好的方法来封装它以保持调用者清洁?

  3. 我们是否需要让我们的班级成员与此类似

  4. 有没有更好的方法来模拟我们的情况,让我们测试我们是否正确实现了锁?也许没有睡眠语句和自动化检查过程?

线程安全队列.h:

主要.cpp:

0 投票
1 回答
320 浏览

c++ - 当单个线程获取相同互斥锁的 2 个 unique_lock 时,unique_lock 是什么意思?

我有以下代码,来自https://en.cppreference.com/w/cpp/thread/unique_lock。但是,在打印输出时,我看到了一些意想不到的结果,并希望得到一些解释。

代码是:

我的期望:

  1. acc1 将使用 num_things=100 进行初始化,而 acc2 将使用 num_things=50 进行初始化。
  2. 假设线程 t1 首先运行,它获得互斥体 m,带有 2 个锁。一旦锁被锁定,并且可以将 num_things 分配给 num=10
  3. 完成后,它将按顺序打印 from.num_things = 110 和 to.numthings = 60。先“从”,再“到”。
  4. thread1 完成代码的关键部分,包装器 unique_lock 调用其析构函数,这基本上解锁了互斥锁。

这是我不明白的。

我希望先解锁 lock1 填充,然后再解锁 lock2。然后线程 t2 以相同的顺序获取互斥锁并先锁定 lock1,然后锁定 lock2。它还将按顺序运行关键代码直到 cout。

线程 t2 将从 t1 获取全局 acc1.num_things = 110 和 acc2.num_things = 60。

我希望 t2 将首先打印 from.num_things = 115,然后打印 to.numthings = 65。

然而,经过无数次的尝试,我总是得到相反的顺序。这就是我的困惑。

在此处输入图像描述

0 投票
2 回答
2522 浏览

c++ - C ++中的条件变量wait_for

我正在使用condition_variableVisual Studio 2019。该condition_variable.wait_for()函数在std::cv_status::no_timeout没有任何通知的情况下返回。

我认为代码永远不会退出并继续打印*,但它会在打印一些后退出*

这是输出:

为什么会这样?是不是所谓的“虚假唤醒”?</p>

0 投票
1 回答
29 浏览

multithreading - 如果发生异常,唯一锁将解锁互斥锁

预期输出:在 T1 中捕获异常 T1 在 T2 中进入等待状态(因为唯一锁将解锁互斥锁,因此 T2 可以在 T1 完成任务的情况下开始工作) in :T2 out of func out of func

当前输出:在 T1 异常中捕获 T1 进入等待状态 out of func in :T2 out of func

为什么tread 2等待线程1完成甚至发生异常

0 投票
2 回答
433 浏览

c++ - 为什么 conditional_variable::notify_all 可能不会唤醒任何线程?

conditional_variable::notify_all()用来唤醒一个等待线程(只有一个线程在等待unique_lock 确实)。

这段代码大部分时间都运行良好,但是日志文件(详见下文)表明,unique_lock在新创建的线程已经返回后,父线程无法获取。

对于这个问题,我将不胜感激。

这是相关的代码片段:

以下是程序无法正常工作时的相关日志: