栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【62】C++的多线程

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【62】C++的多线程

在C++中,我们如何进行并行化(也就是如何让事情同时发生),因为现在我们为之编程的大多数计算机或处理器或设备都有不止一个逻辑处理线程,它们能够很好地进行并行化。

然而在一般情况下,程序都是单线程的。这意味着当我们编写代码的时候,我们只是让计算机一次只做一行代码或者一条指令。我们写的很多程序,显然都不是特别快,或者它们不需要很好地优化。因为我们还没有真正地编写任何繁重的代码,这些代码实际上需要设备很长时间来计算,这是很简单的东西,但当我们进入复杂的项目,将某些工作移到两个不同的执行线程,这对我们来说是非常有益的。

例如,我们使用std::cin.get()请求来自用户的输入到控制台,然而在等待输入的时候,我们什么也做不了(我们只是在等着接受信息),这就像是一个while(true)循环,一直循环下去,直到我们按下enter键,就好像是我们的线程被阻塞了。但是,如果我们可以做一些其他的事情,比如向控制台打印一些东西,会怎么样呢?(我们任然希望有其他事情发生)。

示例:

#include 
#include 

static bool Is_finished = fasle;

void DoWork()
{
    while(!Is_finished)
    {
        std::cout << "Working..." << std::endl;
    }
}

int main()
{
    std::thread worker(DoWork); //生成定义线程对象
    
    std::cin.get(); //阻塞进程(直到用户按下回车)
    Is_finished = true;  //终止循环
    
    worker.join(); //等待一个线程完成它的工作(等待这个线程加入进来)
    
    std::cin.get();
}

第18行的作用是:阻塞当前线程,直到另一个线程完成。(本例中就是主线程等待Dowork线程完成)。

主线程开始一个工作线程,我们写这个join调用的目的是在主线程上等待工作线程完成所有的任务后,再执行主线程。

这意味着直到Dowork中的所有内容都完成,std::cin.get()语句才会运行。

我们希望这个while循环继续,直到cin.get()实际返回一些东西,因为cin.get()会等待我们按下回车键。所以我们想编写一个程序,直到我们按下

回车键。等待我们按回车的那行代码阻塞了执行,因为它在等待我们按回车,所以它不能连续打印working。所以在一个线程上这并不能真正工作,

我们需要能够在同一时间做两件事,我们希望能够等待用户按下enter键,并反复检查用户是否按下enter键,而且我们还希望将“working”记录到控制台。

这里多线程的问题是:如果我们不断地像这样以最快的速度打印“working”,它会导致这个线程的CPU使用率达到100%。对此,我们进行一些改进:

#include 
#include 

static bool Is_finished = fasle;

void DoWork()
{
    using namespace std::literals::chrono_literals;
    while(!Is_finished)
    {
        std::cout << "Working..." << std::endl;
        std::this_thread::sleep_for(1s); //让该线程停止1s
    }
}

int main()
{
    std::thread worker(DoWork); //生成一个线程对象
    
    std::cin.get(); //阻塞进程(直到用户按下回车)
    Is_finished = true;  //终止循环
    
    worker.join(); //等待一个线程完成它的工作(等待这个线程加入进来)
    std::cout << "Finished." << endl;
    
    std::cin.get();
}

使用std::this_thread::操作可以给该线程执行操作。

例如:可以使用std::this_thread::sleep_for(1s),让该线程停止1s;

使用std::this_thread::get_id(),可以得到该线程的id。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号