问题标签 [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 投票
1 回答
46 浏览

c++ - 此代码异常处理是否正确?

在下面的代码中,事件可能会抛出异常并且它可能不会在偶数处理程序中处理,(罕见但仍然如此)

我希望在执行事件时保持“lck2”解锁,因为我不希望“mtx2”的主线程阻塞,原因无非是优化。

我可以保证“lck2”总是在 catch 块中释放吗?或者可能存在运行时异常,因此可能导致死锁或一些意外行为?

0 投票
2 回答
1724 浏览

c++ - 在同一个互斥体上使用两个 std::unique_lock 会导致死锁?

我在代码审查堆栈交换中找到了这段代码,它实现了生产者-消费者问题。我在这里发布一段代码。

在给定的代码中,让我们考虑一个场景,当生产者通过调用产生一个值时void add(int num),它获取了互斥锁mubuffer.size()==size_这使得生产者由于条件变量而进入等待队列cond

同时,发生上下文切换,消费者调用函数int remove()来消费 value ,它试图获取 mutex 上的锁mu,但是锁之前已经被生产者获取,所以它失败并且永远不会消费 value,从而导致僵局。

我在哪里错了?因为当我运行它时代码似乎可以正常工作,所以调试它并没有帮助我。

谢谢

0 投票
2 回答
43 浏览

multithreading - 线程通知不适用于我的消费者

我有一个生产者/消费者的尝试

制片人

消费者

邮箱

主要的

互斥锁虽然是异步工作的,因为我无法控制 astd::thread何时开始,所以我决定使用std::unique_lock除了std::mutex.

问题是,消费者等待,生产者在没有通知的情况下继续前进,至少这是调试器告诉我的,最后一次生产者迭代结果是 abort() 所以这里出了点问题。

0 投票
0 回答
196 浏览

multithreading - 一个线程中应该使用多少互斥锁

我正在处理一个 c++ (11) 项目,在主线程上,我需要检查两个变量的值。这两个变量的值将由其他线程通过两个不同的回调来设置。我正在使用两个条件变量来通知这两个变量的变化。因为在 C++ 中,条件变量需要锁,我不确定是否应该为两个条件变量使用相同的互斥锁,或者我应该使用两个互斥锁来最小化独占执行。不知何故,我觉得一个互斥体就足够了,因为在一个线程(在这种情况下为主线程)上,代码无论如何都会按顺序执行。检查(等待)两个变量值的主线程上的代码无论如何都不会交错。如果您需要我编写代​​码来说明问题,请告诉我。我可以准备那个。谢谢。

更新,添加代码:

0 投票
1 回答
159 浏览

c++ - 在简单的生产者和消费者中使用 unique_lock 的困难

我根据 C++11 注释编写了一个非常简单的 Producer/Consumer,无法弄清楚为什么 unique_lock() 在超出范围时不释放锁。

并将其用作:-

输出是: -

所以从技术上讲,是的,生产者需要告诉消费者我准备好了,消费者需要让生产者知道发送更多数据。我不清楚要使用什么,条件变量是这样做还是 unique_lock 是这样做的。

确切地说,当范围可以释放锁时,为什么我需要(1)和(2)

==编辑== 以下是编辑后的代码,效果很好,

现在,如果我想在 Producer 或 Consumer 如果 sleep 有风险,我该如何引入一点节流?

0 投票
1 回答
81 浏览

compilation - unique_lock 编译错误大括号初始值设定项

我很困惑...

因此,我有一段代码;

“unique_lock < std::mutex > lk (mut)” 行编译失败,出现此错误;

**g++ -pthread --std=c++11 main.cxx main.cxx:42:31: error: mut is not a type

unique_lock<std::mutex> lk(mut);**

但是,如果我将其更改为...(请注意大括号初始化程序是唯一的区别)

它编译得很好。

我有其他代码使用工作/编译良好的非大括号初始化程序进行初始化。到底为什么会这样,也许我累了:)

干杯

G

0 投票
2 回答
1148 浏览

c++ - 当相同的互斥锁与其他地方的 lock_guard 一起使用时,等待/通知 unique_lock 互斥锁是否安全?

我正在使用以下等待/信号方式让线程相互通知。

然后将锁定/解锁机制从 unique_lock 转换为 lock_guard,因为我没有返回 unique_lock 以在其他地方使用(等待/信号除外),并且据说 lock_guard 的开销更少:

它有效。

这适用于所有平台还是看起来适用于当前平台?unique_lock 和 lock_guard 可以使用相同的互斥对象相互工作吗?

0 投票
0 回答
36 浏览

c++ - 在单个线程中拥有多个读取器锁

我有数据加上一个Lock = boost::shared_mutex. 我正在锁定数据访问

读卡器锁 ReadLock = boost::shared_lock<Lock>

作家锁 WriteLock = boost::unique_lock<Lock>

显然,可能有很多读者一次读取数据,而只有一个人在写入。但这里有一个问题:

单个线程可能在同一个互斥锁上具有多个读锁,因为它正在调用本身锁定数据的函数(使用 a ReadLock)。但是,正如我所发现的,这会导致互锁:

  • 线程 1 读取锁定数据 (Lock1)
  • 线程 2 使用写锁 (LockW) 等待
  • 线程 1 生成另一个读锁 (Lock2),而 Lock1 仍然存在

现在我得到一个锁,因为Lock2正在等待LockW退出,LockW正在等待Lock1,并且Lock1因为Lock2.

我不知道是否可以更改设计,使每个线程只执行一个ReadLock. 我相信拥有一个让Writers 挨饿的系统会解决我的问题。如何处理我的案件有通用的方法吗?

0 投票
0 回答
567 浏览

c++ - 从线程执行成员方法时出现分段错误

我正在尝试学习 std::threads、std::mutex 和 std::unique_lock。这个想法是创建5个线程。

请求将被写入队列,5 个线程将从队列中提取请求并处理它。

如果队列为空,线程将等待,这将一直持续到用户键入“完成”。

该代码进行了干净的编译。

当我执行它时,它会在创建线程时导致分段错误。

无法从调试器中弄清楚我做错了什么。请帮忙。

这是完整的代码

0 投票
0 回答
743 浏览

c++ - 对 unique_lock 和 scoped_lock 使用相同的互斥锁

使用具有相同互斥锁的 unique_lock 和 scoped_lock 是否合适?允许使用 cv.wait 和可选解锁,同时还提供范围绑定的安全性。

例如;