同步异步和阻塞3-同步阻塞

Posted organic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步异步和阻塞3-同步阻塞相关的知识,希望对你有一定的参考价值。

项目简介和code见《同步异步和阻塞2-测试小项目

 

1. 实现

bool CSyncIO::OnStart()
{
    //loop to handle IO
    for (int i = 0; i < 2; i++)
    {
        int nRet = IO();
        if (m_pCObserver)
            m_pCObserver->OnProgressByCall(100, i);
        NotifyResult(nRet, i);
    }

    return    true;
}

同步的实现很简单,依次call2次 IO() 函数,此时OnStart()由于是在主线程中调用的,IO()函数会阻塞主线程,当IO()完成后然后将结果通知给UI后立即返回。

当然,由于IO是阻塞的,所以所谓的IO处理进度是无法实现的,只有在处理完毕后直接给一个 100 的进度。

 

2. 测试

在OnStart()未返回前,”Stop”按钮会变灰,同时,由于IO会阻塞UI主线程,所以会看到UI被卡住了(注意鼠标旁的一直在转的圈圈,窗口将不会相应任何操作),不明真相的人民群众可能会以为程序是不是已经挂掉了,直到结果返回。

image

 

当”Stop”按钮可用时,2个IO处理已经完毕了,所以在这种模式下”Stop”并没有用,再长的IO也得等待其完成,即使是IO出错。为了避免无限长的等待,很多IO操作,如果socket,都可以设置timeout

image

以上是关于同步异步和阻塞3-同步阻塞的主要内容,如果未能解决你的问题,请参考以下文章

110 同步异步阻塞非阻塞

同步异步、阻塞非阻塞、Netty

概念理解之同步,异步,阻塞,非阻塞

同步/异步和阻塞/非阻塞

同步异步阻塞和非阻塞

阻塞非阻塞和同步异步的区别