C++11: 线程的暂停和继续和停止

当我们执行一个如图片处理视频处理等费时费CPU的操作时,很多时候是将其移到一个线程,并监测其进度,如果这个时候我们需要提供 暂停、恢复、停止的功能,本文就用C++11来实现其功能。

C++11 提供了线程(std::thead,std::async等)以及线程安全等控制(如std::unique_lock std::lock_guard, std::condition_variable等),我们目前假定执行一个任务:任务的粒度是当前线程睡眠1秒,并输出当前进度。我们将任务执行实现在TestThread中的void runProcess(),并在该类提供 暂停(void pause())、恢复(void resume())、停止(void stop())的功能。

暂停和停止的功能主要是通过条件变量std::condition_variable和互斥变量std::mutex来实现

  1. 在每一次循环中检查std::condition_variable::wait是否阻塞。第二个参数则是当返回true才不会阻塞当前线程
void TestThread::runProcess()
{
    std::thread testThread(
       [&]{
        for(int i = 0; i < 100; i++)
        {
            if(!m_isStop)
            {
                std::cout << "current process progress: " << i << std::endl;
                std::this_thread::sleep_for(std::chrono::seconds(1));
                std::unique_lock<std::mutex> lock(m_mutex);
                m_cv.wait(lock, [this]{return !m_isPause;});
            }else{
                break;
            }
        }

    });
    testThread.detach();
}
  1. 当需要暂停时,我们将m_isPause设置为true,再通过std::condition_variable::notify_one通知mutex,从而阻塞当前线程同理,要解除阻塞的线程,则将m_isPause设置为false,再通知mutex,停止则比较好理解,即退出线程,这里需要说一下,线程的退出一般是通过线程的自然死亡来退出线程,即设立标志位(m_isStop)
void TestThread::pause()
{
    std::unique_lock<decltype(m_mutex)> l(m_mutex);
    m_isPause = true;
    m_cv.notify_one();
}

void TestThread::resume()
{
    std::unique_lock<decltype(m_mutex)> l(m_mutex);
    m_isPause = false;
    m_cv.notify_one();
}

void TestThread::stop()
{
    m_isStop = true;
}

调用main函数如下

int main()
{
    TestThread testThread;
    testThread.runProcess();
    int c;
    while ((c = getchar()) != 'q')
    {
        switch(c)
        {
            case 'p':
                testThread.pause();
                break;
            case 'r':
                testThread.resume();
                break;
            case 's':
                testThread.stop();
                break;
        }
    }
}

示例工程下载

  • 2
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
线程是指在一个进程内,执行没有被调度程序轮流执行的一段指令的单个线程线程可以是扮演多种角色的工作流程中的一员,这种工作流程被称为多线程应用程序。多线程应用程序允许多个程序同时执行,该应用程序中的每个线程都可以在不同的时间间隔内运行,并且在执行过程中可以对其进行暂停继续停止等操作。 暂停线程是指停止线程执行,直到另一个线程继续它。线程可能会被暂停以等待外部资源,也可以通过暂停来完成多任务处理。在一个多线程应用程序中,可以暂停单个线程,而不影响应用程序的整体执行线程暂停操作可以通过调用Thread类的sleep()方法或wait()方法来实现。当线程暂停时,它的CPU时间分配将被释放,因此,就可以同时执行其他线程继续线程是指在线程暂停后,再次开始执行线程线程可以在任何时候被暂停,然后在稍后的时间点继续执行。在Java中,线程可以通过调用Thread类中的synchronized()方法来实现继续。在多线程应用程序中,线程可以通过被唤醒或获取锁来继续执行停止线程是指使线程不再继续执行,即完成线程的生命周期。线程可以通过Java中的stop()方法或interrupt()方法来停止。当线程停止时,它将无法再次启动,并且与系统的资源将被释放。停止线程应该是有策略的,以便在完成线程任务以后释放线程资源。如果没有任何策略,那么应用程序中的多线程可能会导致线程冲突、错误或死锁。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值