我很想尝试盛大的中央调度,但我必须开发的是Ubuntu工作站。是libdispatch,以及c / obj-c等的块扩展......可以在linux上使用吗?如果是这样,我该如何获得它们?
答案 0 :(得分:13)
你可能需要使用LLVM Clang (available on Ubuntu)编译器来获取块(我不认为这在gcc中可用,但我没有跟上gcc,所以我可能会错了。)
正在努力将libdispatch (home for the open source libdispatch)移植到Linux。到目前为止,大部分努力似乎都在Debian上,但也有一些在其他发行版上。请参阅以下讨论主题:
答案 1 :(得分:6)
我已经做了一些工作来让Linux X的Mountain X版本的libdispatch工作;结果出现在Github:http://nickhutchinson.me/libdispatch/。
答案 2 :(得分:1)
使用clang-3.4。
答案 3 :(得分:-2)
使用c ++ lambdas而不是使用块。它们在c ++中表现得更好,隐藏的魔法更少。
我这样做:
/// Dispatch a function object to a queue.
template<class F>
static void dispatch_async_function(dispatch_queue_t queue, F f) {
struct context_t {
using function_type = F;
context_t(function_type&& f) noexcept
: _f(std::move(f))
{}
static void execute(void* p) noexcept {
auto context = reinterpret_cast<context_t*>(p);
if (context) {
try {
context->_f();
}
catch(...) {
// error processing here
}
delete context;
}
}
private:
function_type _f;
};
dispatch_async_f(queue, new context_t<F>(std::move(f)), &context_t<F>::execute);
}
如果您需要确保在调用发生之前存在某些共享资源(例如对共享指针保持活动的对象进行回调):
/// Dispatch a function object to a queue. Only execute the function if the tie
/// locks successfully.
template<class F>
static void dispatch_async_tied_function(dispatch_queue_t queue, std::weak_ptr<void> tie, F f) {
struct context_t {
using function_type = F;
context_t(function_type&& f) noexcept
: _f(std::move(f))
{}
static void execute(void* p) noexcept {
auto context = reinterpret_cast<context_t*>(p);
auto lock = _tie.lock();
if (context && tie) {
try {
context->_f();
}
catch(...) {
// error processing here
}
delete context;
}
}
private:
function_type _f;
std::weak_ptr<void> _tie;
};
dispatch_async_f(queue, new context_t<F>(std::move(f)), &context_t<F>::execute);
}
像这样打电话给他们
dispatch_function(queue, []() { something(); });
...或
dispatch_tied_function(_myQueue, shared_from_this(), [this]() { somethingOnThis(); });