直到现在我std::queue在我的项目中使用.我测量了此队列上特定操作所需的平均时间.
在两台机器上测量时间:我的本地Ubuntu VM和远程服务器.使用时std::queue,两台机器的平均值几乎相同:约750微秒.
然后我"升级" std::queue到boost::lockfree::spsc_queue,所以我可以摆脱保护队列的互斥锁.在我的本地虚拟机上,我可以看到巨大的性能提升,平均现在是200微秒.然而,在远程机器上,平均值高达800微秒,这比以前慢了.
首先我认为这可能是因为远程机器可能不支持无锁实现:
并非所有硬件都支持同一组原子指令.如果硬件不可用,则可以使用防护装置在软件中进行仿真.然而,这具有失去无锁属性的明显缺点.
要确定是否支持这些指令,请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) 我试图找到pthread库的源代码.(我猜它应该是Linux源代码的一部分)
但不知何故找不到任何有它的好网站.
我喜欢这个网站:http://lxr.linux.no/#linux+v2.6.34.1/我经常找到我需要的东西.某种程度上pthread源是不可搜索的.无论如何,我想提一下,我需要一个链接到可浏览(和可搜索)的网站.
浏览linux源代码的网站可能是个人品味的问题.因此欢迎所有指向pthread源的链接.
最有可能的是,我最终会将所有这些书签加入书签,通过它们查看,然后接受最佳答案.
我一直在寻找试图找出Linux中ac/c ++进程的最大互斥量是多少而没有成功.还有,有办法修改这个数字.我正在阅读的书中提到了如何找到Linux中允许的最大线程数以及如何修改此数字但没有提到互斥锁.
在 Linux 中存在系统调用之前futex,线程库使用哪些底层系统调用来pthreads阻塞/休眠线程并随后从用户空间唤醒这些线程?
例如,如果一个线程尝试获取互斥锁,用户态实现将阻止该线程(可能在很短的旋转间隔之后),但我找不到用于此目的的系统调用(除了相对较新的创建的系统调用之外futex) )。