我正在尝试实现一个将跨多个线程起作用的消息系统。boost::lockfree::queue
似乎是一个很好的方向,不幸的是,我很难创建std::function
或boost::function
类型的队列,因为显然它们没有琐碎的分配和destructor,这是boost::lockfree::queue
的要求。
我的以下代码:
#include <cassert>
//#include <functional>
#include <iostream>
#include <boost/function.hpp>
#include <boost/lockfree/queue.hpp>
int main()
{
boost::lockfree::queue<boost::function<void(int)>> queue;
assert(queue.is_lock_free());
for(int j = 0; j < 50; ++j) {
queue.push([] (int i) { std::cout << i << std::endl; });
}
int i = 0;
boost::function<void(int)> functor;
while (queue.pop(functor)) {
functor(i++);
}
}
产生以下输出:
In file included from /usr/include/boost/integer.hpp:23:0,
from /usr/include/boost/function/function_base.hpp:21,
from /usr/include/boost/function/detail/prologue.hpp:17,
from /usr/include/boost/function.hpp:24,
from lockfree.cpp:5:
/usr/include/boost/lockfree/queue.hpp: In instantiation of ‘class boost::lockfree::queue<boost::function<void(int)> >’:
lockfree.cpp:10:54: required from here
/usr/include/boost/lockfree/queue.hpp:81:5: error: static assertion failed (boost::has_trivial_destructor<T>::value)
BOOST_STATIC_ASSERT((boost::has_trivial_destructor<T>::value));
^
/usr/include/boost/lockfree/queue.hpp:85:5: error: static assertion failed (boost::has_trivial_assign<T>::value)
BOOST_STATIC_ASSERT((boost::has_trivial_assign<T>::value));
有什么方法可以做到这项工作?
您仍然可以使用无状态 lambdas带有原始功能指针,如果是一个选项:
#include <cassert>
#include <functional>
#include <iostream>
#include <boost/function.hpp>
#include <boost/lockfree/queue.hpp>
int main() {
//boost::lockfree::queue<boost::function<void(int)>> queue(50);
boost::lockfree::queue<void (*)(int)> queue(50);
assert(queue.is_lock_free());
for (int j = 0; j < 50; ++j) {
queue.push([](int i) { std::cout << i << std::endl; });
}
int i = 0;
boost::function<void(int)> functor;
while (queue.pop(functor)) {
functor(i++);
}
}
http://coliru.stacked-crooked.com/a/d577770e3be029760
您可以使用指针模拟琐碎的类型。(这适用于所有lambdas)
#include <cassert>
#include <functional>
#include <iostream>
#include <boost/function.hpp>
#include <boost/lockfree/queue.hpp>
int main()
{
boost::lockfree::queue<boost::function<void(int)>*> queue(3);
assert(queue.is_lock_free());
for(int j = 0; j < 50; ++j) {
auto function = [] (int i) { std::cout << i << std::endl; };
queue.push(new boost::function<void(int)>(function));
}
int i = 0;
boost::function<void(int)> * functor;
while (queue.pop(functor)) {
functor->operator()(i++);
delete functor;
}
}
boost ::功能不满足锁定队列的要求:
- 微不足道的复制构造函
- 微不足道的作业
- 微不足道的破坏者
这是邮件列表上描述您遇到的相同问题的线程,解决方案可能是使用可以复制的函子对象。