[boost] [asio] ip::tcp::socket thread safety

588 views
Skip to first unread message

Gaetano Mendola

unread,
Apr 2, 2012, 11:07:54 AM4/2/12
to bo...@lists.boost.org
Hi all,
reading the manual I see that ip::tcp::socket thread safety on shared object is not safe.

In my application I'm using:

ip::tcp::socket::async_connect
boost::asio::async_read( ip::tcp::socket , ...)

the application queue an async_read or an async_connect inside
the receiving handler (in case of error it retry the connection).

>From an external thread (to stop the reception) I perform a:

ip::tcp::socket::shutdown
ip::tcp::socket::close

do I have realy to synchronize the async_connect/async_read with
shutdown/close ?

Using a mutex to protect those calls seems an overkill, may be shutdown
and close can be called in concurrency with async_connect/async_read and the
documentation is just conservative?

Regards
Gaetano Mendola


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Brad Higgins

unread,
Apr 2, 2012, 12:21:51 PM4/2/12
to bo...@lists.boost.org
Hi Gaetano,

On Apr 2, 2012, at 11:07 AM, Gaetano Mendola wrote:

> Hi all,
> reading the manual I see that ip::tcp::socket thread safety on shared object is not safe.
>
> In my application I'm using:
>
> ip::tcp::socket::async_connect
> boost::asio::async_read( ip::tcp::socket , ...)
>
> the application queue an async_read or an async_connect inside
> the receiving handler (in case of error it retry the connection).
>
>> From an external thread (to stop the reception) I perform a:
>
> ip::tcp::socket::shutdown
> ip::tcp::socket::close
>
> do I have realy to synchronize the async_connect/async_read with
> shutdown/close ?
>
> Using a mutex to protect those calls seems an overkill, may be shutdown
> and close can be called in concurrency with async_connect/async_read and the
> documentation is just conservative?

I would stick to what the documentation says.

The io_service is thread-safe, so to synchronize the socket operations from different threads, you can use io_service::post() from your "external thread". Implement a function that performs the shutdown() and close() calls, and post that function as a completion handler with io_service.post(), using the io_service instance that is handling your async_connect() and async_read() calls. That way, all of the thread-unsafe ip::tcp::socket calls will occur in the single thread that is running io_service.run(), guaranteeing thread safety.

-Brad

Reply all
Reply to author
Forward
0 new messages