async_write()
은 다른 스레드에서 동시에 호출 할 수 없습니다. async_write_some
을 사용하여 청크 단위로 데이터를 전송하며 이러한 청크는 인터리브 될 수 있습니다. 따라서 async_write()
을 동시에 호출하지 않도록 처리하는 것은 사용자의 책임입니다.동시 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를 다루는 것은 쉬운 일이 아니며 많은 미묘한 버그가 나타날 수 있습니다.
전송 속도가 가능한 한 빨리 실행된다고 가정하면 여러 스레드의 데이터를 인터리빙하면 어떤 이점이 있습니까? 전체 전송 속도가 빨라지지는 않을 것이고 스레드가 평균적으로 더 빨리 끝나지 않을 것입니다. –
async_write()에 전달 된 전체 버퍼는 인접한 블록으로 보내야합니다. 구조가 있습니다. 헤더와 파일 내용과 함께 http-answer와 같은 것을 상상해보십시오. 동시 async_write()가 있으면 구조가 손상됩니다. – user222202
부스트 문서로부터 : 이 조작은 스트림의 async_write_some 함수에 대한 0 회 이상의 호출로 구현되며 작성 조작이라고합니다. 프로그램은이 작업이 완료 될 때까지 스트림이 다른 쓰기 작업 (async_write, 스트림의 async_write_some 함수 또는 쓰기 작업을 수행하는 혼합 된 작업)을 수행하지 않도록해야합니다. – user222202