Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Использовать асинхронный вызов - это то же самое, что использовать синхронный вызов в потоке?

Автор вопроса: lucastamoiosОтветов: 1

Я использую boost и хотел бы, чтобы это:

// --- some random function ---
boost::asio::io_service io;
boost::asio::ip::tcp::socket sock;
char b[256];
// connect and stuff here
boost::asio::async_read( sock,
    boost::asio::buffer(b, 256),
    boost::bind( &onRead, _1, _2)
    );

это то же самое

// --- some random function ---
boost::asio::io_service io;
boost::asio::ip::tcp::socket sock;
boost::thread *read_thread;
char b[256];
// connect and stuff here
read_thread = new boost::thread(
    boost::bind( &boost::asio::io_service::run, &( io))
    );
io.post( &read, b, sock);


// --- read function
bool read( char b[], boost::asio::ip::tcp::socket sock){
    boost::asio::read( sock,
        boost::asio::buffer(b, 256),
        boost::bind( &onRead, _1, _2)
        );
}

Я просто хотел бы узнать, что происходит при асинхронном вызове и чем он отличается от синхронизации.

Отредактировано: мой главный вопрос: асинхронный вызов блокирует поток, связанный с io_service?

Отредактировано 2: это решило мои проблемы: http://www.ibm.com/developerworks/linux/library/l-async/?ca=dgr-lnxw02aUsingPOISIXAIOAPI

c++multithreadingasynchronousboostboost-asio

Ответы

Ответ 1 · рейтинг 3 · Kerrek SB

Синхронный вызов возвращается, когда он выполнил свою работу, и результат работы доступен в следующем операторе. Такой вызов вполне может быть заблокирован.

Асинхронный вызов возвращается немедленно, но состояние работы неопределенно. Когда работа выполнена, зарегистрированная функция обратного вызова вызывается ioservice, и, поскольку вы запускаете эту службу в отдельном потоке, обратный вызов также выполняется в этом отдельном потоке.

Асинхронное программирование намного сложнее с точки зрения потока управления, но оно значительно превосходит его с точки зрения производительности. Если чтение и запись являются частью текущей работы сервера, то вам почти всегда лучше использовать асинхронную модель (хотя она вполне может быть однопоточной, но не с Boost). С другой стороны, простые инструменты, которые запускаются один раз и выполняют множество действий в последовательности, могут просто использовать синхронные вызовы, которые проще писать и понимать, и они могут не иметь значения, если вам нужно дождаться результата операций. тем не мение.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы