块和libdispatch在linux上可用吗?

块和libdispatch在linux上可用吗?,linux,libdispatch,Linux,Libdispatch,我很想尝试GrandCentralDispatch,但我需要开发的只是一个Ubuntu工作站。是libdispatch,并且块扩展到c/obj-c等。。。linux上可用吗?如果是这样,我该如何获取它们呢?此时您可能需要使用LLVM编译器来获取块(我认为这在gcc中还不可用,但我还没有跟上gcc的步伐,所以我可能错了。) 目前正在努力移植到Linux。到目前为止,大部分工作似乎都在Debian上,但也有一些工作在其他发行版上。请参阅以下讨论主题: (已存档链接) 我做了一些工作,让OS X

我很想尝试GrandCentralDispatch,但我需要开发的只是一个Ubuntu工作站。是libdispatch,并且块扩展到c/obj-c等。。。linux上可用吗?如果是这样,我该如何获取它们呢?

此时您可能需要使用LLVM编译器来获取块(我认为这在gcc中还不可用,但我还没有跟上gcc的步伐,所以我可能错了。)

目前正在努力移植到Linux。到目前为止,大部分工作似乎都在Debian上,但也有一些工作在其他发行版上。请参阅以下讨论主题:

  • (已存档链接)

我做了一些工作,让OS X Mountain Lion版本的libdispatch在Linux上运行;结果是在GITHUB::

< P>而不是使用块,使用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);
}
或者

使用clang-3.4

  • sudo apt get安装libdispatch dev
  • sudo apt get安装libblocks运行时开发
  • 使用-fblock编译
  • 链接到-lBlocksRuntime-ldispatch

谢谢!很多谷歌搜索结果都让我感到困惑。不客气!有时候,谷歌这样的东西很难找到,特别是在一个不熟悉的主题上。只要你用CLAN就可以了,我就在Ubuntu NATTY上。这就是我尽量避免C++的原因。我已经编程C++大约25年了,但是看你的代码我几乎没有得到任何关于它实际操作的心理图像。C++曾经是“C类”,但这有点太奇怪了。
/// 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(); });