Мне бы хотелось попробовать грандиозную центральную отправку, но все, что мне нужно для разработки, это рабочая станция Ubuntu. Является ли libdispatch и расширение блоков c/obj-c и т.д.... доступно на linux? Если да, то как мне их получить?
Доступны ли блоки и libdispatch в Linux?
Ответ 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(); });