Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Удобно, чтобы для каждой из этих операций была своя очередь.
Очевидное решение — реализация шаблона пулл потоков.
А в чём именно удобство? Мне это совершенно не очевидноSRP — жеж. Ну и отсутствие возможности для dead-lock'а — если вся работа с одним ресурсом (файловой системой, к примеру) идет через одну очередь.
Нуу например std::async в реализации MS именно так и работает.std::async — это тот еще костыль ИМХО. Получение значения оттуда через std::future полностью блокирует текущий поток (что для Main Thread не приемлемо в принципе). А я не хочу блокироваться, я хочу получить уведомление о том, что все закончилось в контексте текущей очереди тогда, когда данные будут получены.
SRP — жеж. Ну и отсутствие возможности для dead-lock'а — если вся работа с одним ресурсом (файловой системой, к примеру) идет через одну очередь.
std::async — это тот еще костыль ИМХО. Получение значения оттуда через std::future полностью блокирует текущий поток (что для Main Thread не приемлемо в принципе). А я не хочу блокироваться, я хочу получить уведомление о том, что все закончилось в контексте текущей очереди тогда, когда данные будут получены.
Зачем нам надо много пулов потоков я пока так и не понялУ нас только один пулл потоков. Он синглтон
async_queue.async([=]{
file_data = get_data_from_file( file_name );
async_queue.async([=]{
parsed_data = parse( file_data );
main_queue.async([=]{
update_ui_with_new_data( parsed_data ) ;
});
});
});
async_queue.async([=]{
file_data = get_data_from_file( file_name );
parsed_data = parse( file_data );
main_queue.async([=]{
update_ui_with_new_data( parsed_data ) ;
});
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// do smth
dispatch_async(dispatch_get_main_queue(), ^{
// do smth in main thread
});
});dispatch::queue(dispatch::QUEUE_PRIORITY::DEFAULT).async([]{
// do smth
dispatch::queue::main_queue()->async([]{
// do smth in mai thread
});
}); static dispatch_once_t once;
static dispatch_queue_t queue;
dispatch_once(&once, ^{
queue = dispatch_queue_create("queue name", DISPATCH_QUEUE_SERIAL);
});
dispatch_async(queue, ^{
// do smth
dispatch_async(dispatch_get_main_queue(), ^{
// do smth in main thread
});
});
NSArray* array = @[ []{ std::cout << "hello" << std::endl; } ];
void(^say_hello)() = [array lastObject];
say_hello();А теперь представьте, что вы пишете кроссплатформенный код на чистом С++. Например вы используете cocos2d-x, и хотите чтобы ваш код запускался на iOS, Android, WindowsPhone8, BlackBerry, MeeGo, win32, Linux, Win8 Metro, Mac OS X. Вы там не сможете использовать Objective-C блоки в принципе. Вот тут и появляются велосипеды ))
,, пропеллерами разящих.file_io_queue.async([=]{
file_data = get_data_from_file( file_name );
parser_queue.async([=]{
parsed_data = parse( file_data );
main_queue.async([=]{
update_ui_with_new_data( parsed_data ) ;
});
});
});
Не бойтесь велосипедов. Или еще один Grand Central Dispatch (GCD) на C++11