问题标签 [boost-thread]

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 回答
1046 浏览

boost - Boost中的pthread是什么?

我发现Boost库中也有一个pthread,它和posix pthread是一样的吗?

0 投票
1 回答
1668 浏览

boost - 无法链接 libboost 库以在 RHEL 上编译 sslsniff

尝试sslsniff在此处构建 RHEL 5.2 系统。在 RHEL 上编译sslsniff时,我在使用libboost软件包(来自 rpmforge 等存储库)和libboost从源代码编译(似乎是成功的)时遇到了同样的错误。我也在一个新系统上尝试过这个(没有以前/失败/垃圾安装libboost等)。 )

还有更多,但我想有一个帖子长度限制..

他们中的大多数似乎与boost::system所以我添加-lboost_system到链接器命令并走得更远:

现在错误与boost::detail和相关boost::filesystem::detail

我试过使用 boost 1.35 和 1.42(最新)。

在我自己的 Ubuntu 系统上,我从 Ubuntu 存储库中安装了库,并且能够很好地编译+链接 sslsniff。

提前致谢。

0 投票
2 回答
901 浏览

c++ - Boost 线程特定存储问题 (boost/thread/tss.hpp)

boost 线程库具有线程特定(本地)存储的抽象。我浏览了源代码,似乎 TSS 功能可以在任何现有线程的应用程序中使用,无论它是从 boost::thread 创建的天气如何——也就是说,这意味着某些回调已向内核注册以挂钩回调函数,当线程或进程超出范围时,该函数可能调用任何 TSS 对象的析构函数。我找到了这些回调。

我需要在各种 Web 服务器的工作线程中缓存来自 OpenSSL 的 HMAC_CTX(请参阅这个,详细的,关于我要做什么的问题),因此我不控制线程的生命周期 - 网络-服务器可以。因此,我将在不是由 boost::thread 创建的线程上使用 TSS 功能。

我只是想在开始实现缓存逻辑之前验证我的假设,我的逻辑有什么缺陷吗?

0 投票
1 回答
280 浏览

multithreading - 可移植线程特定存储机制的命名方案如何生成线程相关唯一标识符?

一个可移植的线程特定存储引用/身份机制,其中 boost/thread/tss.hpp 是一个实例,需要一种为其自身生成唯一密钥的方法。该键在线程范围内是唯一的,随后用于检索它所引用的对象。这种机制用于以线程中立方式编写的代码中。

既然 boost 是这个概念的一个可移植的例子,那么这种机制具体是如何工作的呢?

0 投票
2 回答
451 浏览

c++ - 杀死具有套接字的单独线程

我有一个单独的线程ListenerThread,它有一个套接字来监听某个远程服务器广播的信息。这是在我需要开发的一个类的构造函数中创建的。

由于要求,一旦启动单独的线程,我需要避免主线程上的任何阻塞功能。一旦到了调用我的类的析构函数的地步,我就无法在侦听器线程上执行连接,所以我唯一能做的就是杀死它。

我的问题是:

  1. 传递给 thead 的函数分配的网络资源会发生什么变化?套接字是否正确关闭或可能有一些待处理的事情?(最担心这个)

  2. 这个过程是否足够快,即线程是否被杀死以便立即中断?

  3. 我正在使用 Linux ...我可以检查什么命令或什么来确保没有未决的网络资源或操作系统出现问题

我非常感谢你的帮助

问候 MNSTN

注意:我在 C++ 中使用 boost::thread

0 投票
5 回答
589 浏览

performance - 循环的并行版本不比串行版本快

我正在用 C++ 编写一个程序来执行特定系统的模拟。对于每个时间步,执行的最大部分是由单个循环占用。幸运的是这是令人尴尬的并行,所以我决定使用 Boost Threads 来并行化它(我在 2 核机器上运行)。由于没有锁定,我希望加速接近串行版本的 2 倍。但是我发现根本没有加速。

我实现了循环的并行版本,如下所示:

  • 唤醒两个线程(它们被阻塞在屏障上)。
  • 然后每个线程执行以下操作:

    • 原子地获取并增加一个全局计数器。
    • 检索具有该索引的粒子。
    • 对该粒子执行计算,将结果存储在单独的数组中
    • 等待工作完成障碍
  • 主线程等待作业完成屏障。

我使用这种方法是因为它应该提供良好的负载平衡(因为每次计算可能需要不同的时间)。我真的很好奇是什么可能导致这种放缓。我总是读到原子变量很快,但现在我开始怀疑它们是否有性能成本。

如果有人有一些想法要寻找什么或任何提示,我将不胜感激。我一直在抨击它一个星期,并且分析并没有透露太多。

编辑:问题解决了! 我将详细说明我是如何解决这个问题的。我再次使用 gprof,但这次编译时没有优化标志 (-O3)。立即,分析器表明我在对每个粒子执行计算的函数上花费了令人难以置信的时间:比在串行版本中要多得多。

这个函数是虚拟的,可以多态访问。我更改了代码以直接访问它,而不是通过 vtable 和瞧,并行版本产生了近 2 的加速!串行版本的相同更改几乎没有效果。

我不确定为什么会这样,如果有人知道,我会很感兴趣!

感谢所有的海报。你们都在一定程度上有所帮助,很难接受一个答案。

0 投票
6 回答
3033 浏览

c++ - 建模 boost::Lockable 与信号量而不是互斥锁(以前的标题:从不同的线程解锁互斥锁)

我正在使用 C++ boost::thread 库,就我而言,这意味着我正在使用 pthreads。正式地,必须从锁定它的同一个线程解锁互斥锁,我想要能够锁定一个线程然后解锁另一个线程的效果。有很多方法可以做到这一点。一种可能性是编写一个允许这种行为的新互斥类。

例如:

我应该指出,上面的代码并不能保证 FIFO 访问,因为如果一个线程调用 lock() 而另一个调用 unlock(),则第一个线程可能会先于其他正在等待的线程获取锁。(想想看, boost::thread 文档似乎没有为互斥锁或条件变量做出任何明确的调度保证)。但是,让我们暂时忽略这一点(以及任何其他错误)。

我的问题是,如果我决定走这条路,我是否能够使用这样的互斥锁作为 boost Lockable 概念的模型。例如,如果我使用 boost::unique_lock< inter_thread_mutex > for RAII 样式访问,然后将此锁传递给boost::condition_variable_any.wait()等,会不会出现任何问题?

一方面,我不明白为什么不这样做。另一方面,“我不明白为什么不”通常是确定某事是否可行的一种非常糟糕的方式。

我问的原因是,如果事实证明我必须为 RAII 锁和条件变量以及其他任何东西编写包装类,那么我宁愿找到其他方法来达到相同的效果。

编辑:我想要的那种行为基本上如下。我有一个对象,每当修改它时都需要锁定它。我想从一个线程锁定对象,并对其进行一些工作。然后我想在告诉另一个工作线程完成工作时保持对象锁定。因此,当工作线程完成时,第一个线程可以继续执行其他操作。当工作线程完成时,它会解锁互斥锁。

而且我希望过渡是无缝的,所以当线程 1 开始工作和线程 2 完成它时,没有其他人可以在两者之间获得互斥锁。

像 inter_thread_mutex 这样的东西似乎可以工作,并且它还允许程序与其交互,就好像它是一个普通的互斥锁一样。所以这似乎是一个干净的解决方案。如果有更好的解决方案,我也很乐意听到。

再次编辑:我需要锁开始的原因是有多个主线程,并且锁在那里防止它们以无效的方式同时访问共享对象。所以代码已经在主线程级别使用了循环级别的无锁操作序列。此外,在最初的实现中,没有工作线程,互斥锁是普通的 Kosher 互斥锁。

inter_thread_thingy 是作为优化提出的,主要是为了提高响应时间。在许多情况下,保证操作 A 的“第一部分”发生在操作 B 的“第一部分”之前就足够了。举个愚蠢的例子,假设我打了对象 1 并给它一个黑眼圈。然后我告诉对象 1 改变它的内部结构以反映所有的组织损伤。在继续打对象 2 之前,我不想等待组织损伤。但是,我确实希望组织损伤作为同一操作的一部分发生;例如,在此期间,我不希望任何其他线程以使组织损坏无效操作的方式重新配置对象。(是的,这个例子在很多方面都不完美,不,我不是在做游戏)

因此,我们对模型进行了更改,其中可以将对象的所有权传递给工作线程以完成操作,并且它实际上工作得很好;每个主线程都能够完成更多操作,因为它不需要等待它们全部完成。而且,由于主线程级别的事件排序仍然是基于循环的,因此编写高级主线程操作很容易,因为它们可以基于操作完成的假设(更准确地说,关键的“当相应的函数调用返回时,排序逻辑所依赖的第一部分完成)。

最后,我认为使用带有增强锁的 RAII 使用 inter_thread mutex/semaphore thingies 来封装使整个事情正常工作所需的必要同步会很好。

0 投票
1 回答
1409 浏览

c++ - 对信号量的 RAII 访问使用 boost 锁

假设我编写了一个 C++ 信号量类,其接口模拟了 boost Lockable 概念(即lock(); unlock(); try_lock();等)。对此类对象的 RAII 访问使用增强锁是否安全/推荐?换句话说,boost 锁(和/或 boost 线程库的其他相关部分)是否假设 Lockable 概念只能由从同一线程锁定和解锁的类似互斥体的对象建模?

我的猜测是使用信号量作为 Lockable 的模型应该没问题。我浏览了一些增强源,它“似乎”还可以。这些锁似乎没有存储对 this_thread 或类似内容的显式引用。此外,Lockable 概念没有像whichThreadOwnsMe(). 看起来我什至应该能够传递boost::unique_lock<MySemaphore>boost::condition_variable_any::wait. 但是,文档并没有明确说明这些要求。

为了说明我的意思,考虑一个简单的二进制信号量类:

现在假设某个地方,无论是在对象上还是在全局范围内,我都有

我想使用 RAII 锁定和解锁它。此外,我希望能够将锁的所有权从一个线程“传递”到另一个线程。例如,在一个线程中我执行

当另一个线程正在执行类似

我这样做的原因是我不希望其他人能够在第一个线程执行的时间和第二个线程执行的时间sem之间获得锁定。基本上,我将一项任务分为两部分。我将任务拆分的原因是(1)我希望任务的第一部分尽快开始,(2)我想保证第一部分在 doTask() 返回之前完成, (3) 我希望任务的第二个更耗时的部分由另一个线程完成,可能是从等待完成由主线程启动的任务的从属线程池中选择的。doSomeWorkWithSharedObject()doMoreWorkWithSameSharedObject()

注意:我最近在这里发布了同样的问题(有点)Modeling boost::Lockable with semaphore 而不是 mutex (以前的标题:Unlocking a mutex from a different thread) 但我将互斥锁与信号量混淆了,所以关于使用升压锁的问题并没有真正得到解决。

0 投票
2 回答
2745 浏览

c++ - How to use boost::bind with non-copyable params, for example boost::promise?

Some C++ objects have no copy constructor, but have move constructor. For example, boost::promise. How can I bind those objects using their move constructors ?

0 投票
2 回答
699 浏览

c++ - 执行简单的 boost 线程程序时出错

你能告诉 mw 下面的 boost::thread 程序有什么问题吗

};

}

我收到错误消息:错误:在 'thr1' 中请求成员 'join',它是非类类型 'boost::thread()(A ( )())' BoostThread2.cpp:30:错误:请求对于'thr2'中的成员'join',它是非类类型'boost :: thread()(A()())'