在C ++中同时执行多个作业

时间:2014-08-24 10:27:22

标签: c++ windows

我在C ++中创建了一个登录命令行界面,其中一个选框将无限期运行,在下一行中,用户可以输入他的ID和密码。我希望这两个工作,即同时输入marquee和id输入,但只有下面的代码只有marquee运行无限时间。我正在使用Windows操作系统,我是C ++的新手,因此我无法应用线程概念。

char m[]={"- A cool marquee effect. Programmed by Roneet -"};
int main()
{
    marquee();
    cout<<setw(35)<<"Enter Username : ";
    getline(cin,str);
    cout<<setw(35)<<"Enter Password : ";

    return 0;
}
void marquee()
{
    while(a<131)
    {
        p=m[0];
        m[0]=m[c];
        m[c]=p;
        for(j=1;j<=b;j++)
            cout<<m[j];
        for(j=0;j<N;j++){}
        c--;
        cout<<"\r";
        if(c<1){c=b;a++;if(a==100)N=51500;}
    }
    system("PAUSE");
}

1 个答案:

答案 0 :(得分:1)

首先,std流不是线程安全的,您需要添加std::mutex来保护每个std::cout操作。

其次,要在单独的线程中轻松执行函数,请使用std::async

#include <future>

std::future<void> fut = std::async(&marquee);

示例:

#include <atomic>
#include <future>
#include <string>
#include <iostream>

std::atomic<bool> cond{ false };

void marquee()
{
    while (!cond)
    {
        std::cout << '*' << std::flush;
    }
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cerr.tie(nullptr);

    std::cout << "Enter username and then password: " << std::flush;

    std::future<void> task = std::async(std::launch::async, &marquee);

    std::string user, pass;
    std::cin >> user >> pass;

    cond = true;

    task.get();

    return 0;
}