async_write()
запрещено вызывать одновременно из разных потоков. Он отправляет данные порциями, используя async_write_some
, и такие порции можно чередовать. Таким образом, пользователь должен позаботиться о том, чтобы не вызывать async_write()
одновременно.
Есть ли лучшее решение, чем этот псевдокод?
void send(shared_ptr<char> p) {
boost::mutex::scoped_lock lock(m_write_mutex);
async_write(p, handler);
}
Мне не нравится идея блокировать другие потоки на довольно долгое время (в моем приложении ~ 50Mb отправки).
Может что-то подобное сработает?
void handler(const boost::system::error_code& e) {
if(!e) {
bool empty = lockfree_pop_front(m_queue);
if(!empty) {
shared_ptr<char> p = lockfree_queue_get_first(m_queue);
async_write(p, handler);
}
}
}
void send(shared_ptr<char> p) {
bool q_was_empty = lockfree_queue_push_back(m_queue, p)
if(q_was_empty)
async_write(p, handler);
}
Я бы предпочел найти готовый рецепт из поваренной книги. Разобраться с lock-free непросто, может появиться много малозаметных багов.