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

  • Post author:
  • Post category:其他


到目前为止,我在项目中使用的是boost::lockfree::queue。 我测量了此队列上特定操作所需的平均时间。

时间是在两台机器上测量的:我的本地Ubuntu VM和一台远程服务器。使用boost::lockfree::queue,两台计算机上的平均值几乎相同:〜750微秒。

然后,我将boost::lockfree::queue“升级”到bool is_lock_free(void) const;,这样我就可以摆脱保护队列的互斥锁了。 在我的本地VM上,我可以看到巨大的性能提升,现在平均为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

#include

#include

#include

#include

/* Using blocking queue:

* #include

* #include

*/

#include

boost::lockfree::spsc_queue> queue;

/* Using blocking queue:

* std::queue queue;

* std::mutex mutex;

*/

int main()

{

auto producer = std::async(std::launch::async, [queue /*,mutex*/]()

{

// Producing data in a random interval

while(true)

{

/* Using the blocking queue, the mutex must be locked here.

* mutex.lock();

*/

// Push random int (0-9999)

queue.push(std::rand() % 10000);

/* Using the blocking queue, the mutex must be unlocked here.

* mutex.unlock();

*/

// Sleep for random duration (0-999 microseconds)

std::this_thread::sleep_for(std::chrono::microseconds(rand() % 1000));

}

}

auto consumer = std::async(std::launch::async, [queue /*,mutex*/]()

{

// Example operation on the queue.

// Checks if 1234 was generated by the producer, returns if found.

while(true)

{

/* Using the blocking queue, the mutex must be locked here.

* mutex.lock();

*/

int value;

while(queue.pop(value)

{

if(value == 1234)

return;

}

/* Using the blocking queue, the mutex must be unlocked here.

* mutex.unlock();

*/

// Sleep for 100 microseconds

std::this_thread::sleep_for(std::chrono::microseconds(100));

}

}

consumer.get();

std::cout << “1234 was generated!” << std::endl;

return 0;

}



版权声明:本文为weixin_32158567原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。