Me gustaría probar el despacho de grand central, pero todo lo que tengo que desarrollar es una estación de trabajo Ubuntu. ¿Libdispatch y la extensión de bloques a c/obj-c, etc. están disponibles en Linux? Si es así, ¿cómo los obtengo?¿Hay bloques y libdispatch disponibles en Linux?
Respuesta
Puede que necesite utilizar el compilador LLVM Clang (available on Ubuntu) para obtener bloques en este momento (no creo que esto esté disponible en gcc todavía, pero no he estado al día con gcc, por lo que podría estar equivocado).
Hay esfuerzos en curso para el puerto libdispatch (home for the open source libdispatch) para Linux. La mayor parte del esfuerzo parece estar en Debian hasta ahora, pero también en otras distribuciones. Ver estas líneas de discusión:
que he hecho algún trabajo para obtener la versión OS X Mountain Lion de libdispatch trabajar en Linux; el resultado está arriba en Github: http://nickhutchinson.me/libdispatch/.
En lugar de usar bloques, use C++ lambdas. Juegan mejor con C++ y hay menos magia escondida.
lo hago de esta manera:
/// 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);
}
Y si es necesario asegurarse de que existe algún recurso compartido antes de la llamada tiene lugar (como una devolución de llamada en un objeto que se mantiene vivo gracias a un puntero compartido) :
/// 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);
}
los llaman como esto
dispatch_function(queue, []() { something(); });
o ...
dispatch_tied_function(_myQueue, shared_from_this(), [this]() { somethingOnThis(); });
Utilice clang-3.4.
- sudo apt-get install libdispatch-dev
- sudo apt-get install libblocks-runtime-dev
- compilar con -fblocks
- Enlace con -lBlocksRuntime -ldispatch
- 1. ¿Hay bibliotecas ccTalk disponibles?
- 2. ¿Podría Grand Central Dispatch (`libdispatch`) estar disponible en Windows?
- 3. ¿Qué IDEs están disponibles para R en Linux?
- 4. ¿Hay ncurses disponibles para Windows?
- 5. ¿Cuántas fuentes hay disponibles en Prawn?
- 6. ¿Hay perfiladores de SQLite disponibles?
- 7. ¿Qué bibliotecas de voz están disponibles en Linux?
- 8. ¿Hay funciones simples de operación de archivos C como getc, putc y seek disponibles en el kernel de Linux?
- 9. ¿Hay tareas ssh y scp disponibles para phing?
- 10. Bloques y Procs en Ruby
- 11. Limite la memoria y la CPU disponibles para un usuario en Linux
- 12. ¿Hay soluciones de código abierto CAPTCHA disponibles?
- 13. Bloques estáticos y variables
- 14. ¿Hay un puntero SELF para los bloques?
- 15. ¿Hay otras implementaciones de SecurityManager disponibles?
- 16. ¿Hay implementaciones de filtros de Bloomier disponibles?
- 17. ¿Hay buenos geoparsers de código abierto disponibles?
- 18. Xcode 4.3 - error: no hay identidades disponibles
- 19. No hay indicadores O_BINARY y O_TEXT en Linux?
- 20. killproc y pidofproc en Linux
- 21. ¿Hay diferencias significativas entre bloques en Ruby vs Groovy?
- 22. Linux: enumere todos los administradores de ventana disponibles
- 23. ¿Dónde hay una lista de intenciones disponibles en Android?
- 24. ¿Por qué no hay datos seriales disponibles en mi Arduino?
- 25. ¿Hay funciones de DbContext no disponibles en ObjectContext?
- 26. ¿Hay buenos filtros HTML basados en PHP disponibles?
- 27. bloques, bucles y variables locales
- 28. Archivos pequeños y bloques HDFS
- 29. referencias débiles en bloques y ciclos retener
- 30. File.open y bloques en Ruby 1.8.7
Gracias ! Muchas búsquedas de Google no me dieron más que confusión. – mummey
¡De nada! Puede ser sorprendentemente difícil encontrar cosas como esta con Google a veces, particularmente en un tema que no es familiar. –
Mientras estés bien usando clang, estoy [usando gcd bastante feliz] (http://chris.mowforth.com/installing-grand-central-dispatch-on-linux) en ubuntu natty. –