相关疑难解决方法(0)

使用Boost.Lockfree队列比使用互斥锁慢

直到现在我std::queue在我的项目中使用.我测量了此队列上特定操作所需的平均时间.

在两台机器上测量时间:我的本地Ubuntu VM和远程服务器.使用时std::queue,两台机器的平均值几乎相同:约750微秒.

然后我"升级" std::queueboost::lockfree::spsc_queue,所以我可以摆脱保护队列的互斥锁.在我的本地虚拟机上,我可以看到巨大的性能提升,平均现在是200微秒.然而,在远程机器上,平均值高达800微秒,这比以前慢了.

首先我认为这可能是因为远程机器可能不支持无锁实现:

Boost.Lockfree页面:

并非所有硬件都支持同一组原子指令.如果硬件不可用,则可以使用防护装置在软件中进行仿真.然而,这具有失去无锁属性的明显缺点.

要确定是否支持这些指令,请boost::lockfree::queue调用一个方法bool is_lock_free(void) const;.但是,boost::lockfree::spsc_queue没有这样的功能,对我来说,这意味着它不依赖于硬件而且总是无锁 - 在任何机器上.

性能损失的原因是什么?


例子(生产者/消费者)

// c++11 compiler and boost library required

#include <iostream>
#include <cstdlib>
#include <chrono>
#include <async>
#include <thread>
/* Using blocking queue:
 * #include <mutex>
 * #include <queue>
 */
#include <boost/lockfree/spsc_queue.hpp>


boost::lockfree::spsc_queue<int, boost::lockfree::capacity<1024>> queue;

/* Using blocking queue:
 * std::queue<int> queue;
 * std::mutex mutex;
 */

int main()
{
    auto producer = std::async(std::launch::async, …
Run Code Online (Sandbox Code Playgroud)

c++ performance multithreading boost lock-free

42
推荐指数
1
解决办法
1万
查看次数

PThread库的源代码?

我试图找到pthread库的源代码.(我猜它应该是Linux源代码的一部分)

但不知何故找不到任何有它的好网站.

我喜欢这个网站:http://lxr.linux.no/#linux+v2.6.34.1/我经常找到我需要的东西.某种程度上pthread源是不可搜索的.无论如何,我想提一下,我需要一个链接到可浏览(和可搜索)的网站.

浏览linux源代码的网站可能是个人品味的问题.因此欢迎所有指向pthread源的链接.

最有可能的是,我最终会将所有这些书签加入书签,通过它们查看,然后接受最佳答案.

linux open-source pthreads

28
推荐指数
2
解决办法
5万
查看次数

c/c ++ Linux中允许的最大互斥量数

我一直在寻找试图找出Linux中ac/c ++进程的最大互斥量是多少而没有成功.还有,有办法修改这个数字.我正在阅读的书中提到了如何找到Linux中允许的最大线程数以及如何修改此数字但没有提到互斥锁.

c c++ multithreading mutex locking

8
推荐指数
1
解决办法
4613
查看次数

在 futex 之前,Linux 中的线程/进程是如何停放和唤醒的?

在 Linux 中存在系统调用之前futex,线程库使用哪些底层系统调用来pthreads阻塞/休眠线程并随后从用户空间唤醒这些线程?

例如,如果一个线程尝试获取互斥锁,用户态实现将阻止该线程(可能在很短的旋转间隔之后),但我找不到用于此目的的系统调用(除了相对较新的创建的系统调用之外futex) )。

linux multithreading futex

6
推荐指数
1
解决办法
2520
查看次数