我正在用boost::asio编写一些代码,使用异步TCP连接。我不得不承认我对此有一些怀疑。这些都是关于并发的。以下是一些:
如果我在同一个套接字上启动两个或多个,而没有等待第一个套接字的完成,会发生什么情况呢?处理程序(和synchronization? )是重叠的还是asio提供序列化和asio?
async_connect和async_read的上述问题相同。一般来说,从不同的线程调用这些函数安全吗(我不是说使用不同的缓冲区,这是另一个problem...).发布于 2009-12-18 22:05:01
从您的问题中,我假设您有一个io_service实例,您希望从多个线程调用它的async_write()。
async_write()最终调用了io_service的post()方法,该方法反过来获取一个锁并将要写入工作队列的位推送到工作队列中,以确保比特不会被交叉写入。这些位元最终会被写入,保存它们的底层数据结构( char数组或其他任何东西)必须保持有效,直到您得到回调,表示写入已经完成。如果您使用的是与完成处理程序完全相同的回调函数,您将无法知道这两种写操作中哪一种会导致调用该函数,而且如果该函数执行任何不线程安全的操作,则行为可能是未定义的或不正确的。处理这种情况的一种常用方法是拥有一个结构实例,即完成处理程序(只需重载调用()操作符):您可以设置struct的属性以表示它对应的写操作,然后在调用完成处理程序时参考这些值。
但是,如果没有共享锁,您就无法控制哪些线程实际执行其async_write()方法。事实上,即使您启动两个线程,让一个线程立即调用async_write(),让另一个线程休眠一个小时,然后调用async_write(),您仍然不能确信操作系统没有愚蠢地调度您的线程并先执行第二个线程的调用。(这个例子是病态的,但这一点是普遍成立的。)
同样的情况也适用于async_read()。当然,您可以交叉调用(即在调用完成处理程序之前执行一个async_read(),然后执行另一个),但是如果没有一些外部手段来确保这一点,就无法保证将按照您所希望的顺序执行。
发布于 2009-12-16 16:02:10
如果在同一个套接字上启动两个异步操作,它们可能会按任意顺序发生。只要他们使用不同的缓冲区,它是“安全的”,因为它不会崩溃,但这种行为几乎从来不是你想要的。
https://stackoverflow.com/questions/1915520
复制相似问题