是否可以在linux上使用块和libdispatch?

时间:2011-04-12 18:36:33

标签: linux libdispatch

我很想尝试盛大的中央调度,但我必须开发的是Ubuntu工作站。是libdispatch,以及c / obj-c等的块扩展......可以在linux上使用吗?如果是这样,我该如何获得它们?

4 个答案:

答案 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。

  • sudo apt-get install libdispatch-dev
  • sudo apt-get install libblocks-runtime-dev
  • 使用-fblocks编译
  • 与-lBlocksRuntime -ldispatch
  • 链接

答案 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(); });