mutex

std::unique_lock 移动语义

请帮我检查一下我对std::unique_lock移动语义的理解是否正确。 假设我有一个函数myFunc,它需要在执行开始时获取一个互斥锁。 这个函数是从不同的函数调用的,其中一些函数,例如myWrapper1 在调用 myFunc 之前持有相同的互斥锁。 有时我需要在myFunc 的作用域退出时不释放这个锁。 typedef std::unique_lock<std::mutex>... »

c++

在一个简单的 C++ 11 四线程程序中,如果我注释 stdout 打印行,我的两个使用者线程不会返回

我正在学习使用 C++ 11 的同步原语。我必须为模板类编写这些方法,该模板类是一个 FIFO 队列,其最大元素数在构造时声明。 有两个线程将项目推入所述队列,两个线程检索它们。它们通过使用两个条件变量进行同步,以确保消费者线程仅在队列不为空时弹出项目,而生产者线程仅在队列未满时推送新项目。队列具有打开/关闭状态,该状态用作两个条件变量的 wait() 调用中的附加条件。当队列关闭时,线程应该返... »

c++

关于 boost::lock_guard 和 boost::unique_lock

我希望有人能告诉我我对以下 3 把锁的理解是否正确,并可能补充。我主要关心的是速度和开销最小。 boost::lock_guard boost::unique_lock boost::scoped_lock boost::lock_guard 是最轻的一种锁,只在进程的成员之间共享。 unique_lock 是 lock_guard 的改进版本,具有更多功能。 scoped_lock 允许跨... »

c++

在 SerialCommunication C++ 中使用 Mutex 时的多线程问题

我正在开发一个使用 windows 功能的串行通信软件。 在此 CSerialCommhelper 是处理所有串行通信功能的类,而 CphysicalLayer 是利用该类的类。 class CSerialCommHelper : public CCommAgent { HANDLE m_pPortHandle; //Handle to the COM port ... »

C++ 增强互斥锁

最近我在玩 Boost mutex,我不确定我是否可以做到以下几点: boost::recursive_mutex ListLock; int main(){ ListLock.lock(); function1(); ListLock.unlock(); } void function1(){ ListLock.lock(); //some operations L... »

c++

在 pthread 中实现 FIFO 互斥锁

我正在尝试实现支持并发插入的二叉树(即使在节点之间也可能发生),但不必为每个节点分配全局锁或单独的互斥锁或互斥锁。相反,分配的此类锁的数量应该是使用树的线程数量的顺序。 因此,我最终遇到了一种lock convoy 问题。更简单地说,当两个或更多线程执行以下操作时,可能会发生这种情况: 1 for(;;) { 2 锁(互斥锁) 3 do_stuff 4 解锁(互斥) 5 } 也就是说,如... »

c

我可以通过将函数实现为类对象方法来避免使用互斥锁吗

背景:我有一个位置中的文件列表和将用于移动这些文件的moveFile() 函数。我的目标是并行移动所有这些文件。所以,我实现了多个线程。 为了避免冲突,我在moveFile() 之前考虑过互斥锁。这将阻止线程并行运行。 以下是它的实现方式: std::mutex mtx; enum class status { SUCCESS, FAILED }; status moveFile() {... »

c++

旋转门与互斥锁

问题与称为 Turnstile 的同步机制有关。可以在here、here 和here 中找到实现和文档的示例。经过一些研究,我仍然找不到以下问题的答案。 闸机解决了什么问题? 与互斥锁相比,旋转门有什么优势? 线程和闸机之间的所有权关系是什么? (如果有)。 如果我们降低这些实现的复杂性,旋转门的最基本的最小结构是什么?... »

互斥睡眠占用大量 CPU

我使用 ruby​​-prof 分析了我的基于事件机器的应用程序,发现以下有趣: 5.28 0.00 5.28 0.00 4/4 互斥#同步 90.72% 0.00% 5.28 0.00 5.28 0.00 4 互斥#sleep 我认为 ruby​​-prof 只计算 CPU 滴答数,因此我无法弄清楚为什么互斥锁睡眠可能会占用 CPU 时间。我假设它在内... »

mutable boost::mutex 是否可以分离锁定和等待功能?

所以我有像read 这样可以从多个线程同时调用的函数。但我也有一个write 的函数,它需要锁定所有read 函数。在哪里可以获得创建这种架构的示例? 我知道我们可以拥有: mutable boost::mutex the_read_mutex; mutable boost::mutex the_write_mutex; 和: void write() { // make al... »

c++

使用 pthread 进行简单的流水线操作

最近我开始研究 pthreads 并尝试使用 pthreads 实现软件流水线。为此,我自己编写了一个玩具程序,其中一个类似的程序将成为我主要项目的一部分。 所以在这个程序中,主线程创建整数类型的输入和输出缓冲区,然后创建一个主线程 并将这些缓冲区传递给 主线程。 主线程依次创建两个工作线程。 从 ma​​in 传递到 主线程 的 输入 和 输出缓冲区 的大小nxk(例如 5x10 的 i... »

c

原子获取是否与互斥锁释放同步?

我有一个对象,它在 unordered_map 中存储了一些设置,其中包含字符串键和变量值。由于我的库可能会被多个线程使用,并且读取的数量很可能会大大超过写入的数量,因此我考虑了一个写入时复制实现,其中“get”操作是无锁的,而“put”操作是关键的部分,如示例中所示: class Cfg { using M = unordered_map<string,X>; sh... »

c++

查询java中锁机制的实现

正如 Doug Lea 的“Java 中的并发编程”中提到的, Object 类(及其子类)的每个实例都拥有一个锁,该锁在进入同步方法时获得,并在退出时自动释放。 JVM 是否完全在用户空间实现锁机制? 或 JVM 是否依赖操作系统内核空间系统调用来实现锁定?请提供实现锁机制的代码参考。 注意:Java 多线程的新手 ... »

使用互斥锁移动类的语义

我有一个类处理程序: class Handler { private: std::mutex _mutex_list[4]; std:list<Person*> _waiting_list[4]; std::thread __runner_t; public: virtual void start(); }; 我正在尝试在新线程中启动处理程序: ... »

c++

如何扩展 C++ 升压列表容器以使用升压升级互斥体实现线程安全实现?

我编写了一些示例测试代码来验证使用 boost 升级互斥锁在 boost 列表容器上实现读/写互斥锁的功能。我有十个线程,5 个读者,5 个作者。 我使用智能指针来简化内存管理并允许同一对象包含在多个列表中。 编写者不断地删除对象并将其重新插入到各自的列表中,而读者则定期迭代列表。 这一切似乎都按预期工作,但是当调用列表擦除成员函数时,当我已经拥有它时,它必须找到要删除的条目。 擦除方法是否足够聪... »

c++

bash:如何等待一段时间以避免同时运行脚本?

我的问题: 每天晚上,我的 crontab 都会在 CentOS 6.5 下使用 PBS 的超级计算机上启动几个夜间测试。启动时,作业在队列中等待。当调度程序允许运行时,我的工作就开始了。这比调度程序同时启动所有作业更常见(即使我的 crontab 在分开的时刻启动它们)。 我无法修改工作的主要部分(但我可以在之前添加内容)。每个作业都从更新一个通用 SVN 存储库开始。但是,当作业同时开始时... »