据我所知,同步和异步操作之间的主要区别.即write()或read()VS async_write()并且async_read()是前者,不返回,直到操作完成-或无差错,以及最后的,立即返回.
由于异步操作由一个io_service.run()在受控操作完成之前未完成的操作控制.在我看来,顺序操作中涉及与POP3等协议的TCP/IP连接,其中操作是如下序列:
C: <connect>
S: Ok.
C: User...
S: Ok.
C: Password
S: Ok.
C: Command
S: answer
C: Command
S: answer
...
C: bye
S: <close>
Run Code Online (Sandbox Code Playgroud)
同步/异步运算符之间的区别没有多大意义.
当然,在这两种操作中,总是存在程序流程在某些情况下无限期停止的风险 - 使用计时器 - 但我想知道一些更多的授权意见.
我必须承认这个问题定义不明确,但我想听听一些关于何时使用其中一个的建议.我在使用MS Visual Studio调试关于我正在使用的POP3客户端中的异步SSL操作时遇到了问题,有时候认为在这个问题上使用异步可能是个坏主意.
如果我理解正确的话,我想知道异步连接中的定时器的一个方面.
假设我们在执行读操作之前设置了一个计时器,其中包括一个处理程序,然后run()是io_service.
据我了解,io_service在调用后经理结束后立即结束,这可能有两个原因:
a)读操作完成.
b)计时器已达到极限.
假设已达到第一个(a)条件,并且在计时器结束之前已完成读取操作.
问题是:该计时器会发生什么?我们需要完成它吗?说
dTimer_.expires_from_now (boost::posix_time::seconds(0));
after the io_service.run()?
Run Code Online (Sandbox Code Playgroud)
如果有必要可以将相同的计时器对象重新用于另一个读操作,是否可以将其重置为新的时间间隔?
我可以重置()io_service并在run()新操作中重用相同的对象吗?
我已经在不同版本的VS和Boost中将Boost库与MS Visual Studio C ++一起使用了很长时间。
关于Boost,在下载并解压缩后,构建过程如下:
1.-bootstrap从VS提示符下运行。
2.-在中C:\boost_some_ver\project-config.jam,编辑行using msvc ;
并更改为using msvc : 14.0 ;
在这种情况下,14.0对应于VS Express 2015
3.-使用以下命令构建库:
bjam release debug threading=multi --build-type=complete --toolset=msvc address-model=64 stage
Run Code Online (Sandbox Code Playgroud)
现在我必须为VS Studio 2019构建库,并想知道与此编译器对应的工具集。
就是 什么X.XX数量对应于VS快递2019 C ++中using msvc x.xx ;
使用MS Visual C++ 2012
类具有类型的成员 std::atomic_flag
class A {
public:
...
std::atomic_flag lockFlag;
A () { std::atomic_flag_clear (&lockFlag); }
};
Run Code Online (Sandbox Code Playgroud)
有一个类型A的对象
A object;
Run Code Online (Sandbox Code Playgroud)
谁可以被两个(Boost)线程访问
void thr1(A* objPtr) { ... }
void thr2(A* objPtr) { ... }
Run Code Online (Sandbox Code Playgroud)
如果另一个线程正在访问该对象,则该想法是等待该线程.
问题是:是否有可能用atomic_flag对象构造这样的机制?不是说暂时,我想要一些轻量级的boost :: mutex.
顺便说一下,其中一个线程涉及的进程是一个非常长的查询到获得很多行的dBase,我只需要在发生冲突的某个代码区域中挂起它(当处理每一行时)我不能等待整个线程完成join().
我在每个帖子中试过一些:
thr1 (A* objPtr) {
...
while (std::atomic_flag_test_and_set_explicit (&objPtr->lockFlag, std::memory_order_acquire)) {
boost::this_thread::sleep(boost::posix_time::millisec(100));
}
... /* Zone to portect */
std::atomic_flag_clear_explicit (&objPtr->lockFlag, std::memory_order_release);
... /* the process continues */
}
Run Code Online (Sandbox Code Playgroud)
但没有成功,因为第二个线程挂起.实际上,我并不完全理解该atomic_flag_test_and_set_explicit函数所涉及的机制.如果这样的函数不能立即返回,或者可以延迟直到可以锁定标志.
对我来说,如何获得一个具有这样一个函数的锁定机制并始终设置该值并返回之前的值也是一种谜.没有选项只能读取实际设置.
欢迎任何建议.
几年前,我使用Boost asio库编写了一个电子邮件客户端。
有一个带有四个子类的抽象类ICON。
POP3conN 到平面POP3通信
POP3conS 可确保POP3通信的安全
SMTPconN 到平面SMTP通信
SMTPconS 保护SMTP通信安全
ICON有一个会员
boost::asio::ip::tcp::socket socket_
Run Code Online (Sandbox Code Playgroud)
和两个虚拟过程,在echa子类中定义:
void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }
Run Code Online (Sandbox Code Playgroud)
该应用程序在boost_1_63_0上运行良好。但是,当我尝试更新到boost_1_70_0时,编译器(MS V Studio 2015)在这两个定义中都抱怨:
class "boost::asio::ssl::stream<boost::asio::ip::tcp::socket>" has no member "get_io_service".
Run Code Online (Sandbox Code Playgroud)
因为我想对大量的代码和复杂的逻辑进行最小的更改:此遗漏方法是否有解决方法?
c++ ×5
boost ×4
boost-asio ×3
asynchronous ×1
atomicity ×1
boost-thread ×1
c++11 ×1
synchronous ×1
tcp ×1