Подтвердить что ты не робот

Доступны ли блоки и libdispatch в Linux?

Мне бы хотелось попробовать грандиозную центральную отправку, но все, что мне нужно для разработки, это рабочая станция Ubuntu. Является ли libdispatch и расширение блоков c/obj-c и т.д.... доступно на linux? Если да, то как мне их получить?

4b9b3361

Ответ 1

Вам может понадобиться использовать компилятор LLVM Clang (доступно на Ubuntu) для получения блоков в это время (я не думаю, что это доступный в gcc, но я не поддерживал gcc, поэтому я мог ошибаться.)

В настоящее время прилагаются усилия для порта libdispatch (начало для libdispatch с открытым исходным кодом) в Linux. На данный момент большая часть усилий, по-видимому, находится в Debian, но некоторые из других дистрибутивов тоже. Смотрите эти темы обсуждения:

Ответ 2

Я проделал определенную работу, чтобы получить версию Linux Lion версии libdispatch, работающую в Linux; результат в Github: http://nickhutchinson.me/libdispatch/.

Ответ 3

Используйте clang-3.4.

  • sudo apt-get install libdispatch-dev
  • sudo apt-get install libblocks-runtime-dev
  • Скомпилировать с -fblocks
  • Ссылка на -lBlocksRuntime -ldispatch

Ответ 4

Вместо использования блоков используйте С++ lambdas. Они лучше играют с С++, и есть менее скрытая магия.

Я делаю это так:

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