在C ++控制台应用程序中运行两个线程

时间:2015-02-13 07:56:08

标签: c++ multithreading

我在创建使用while循环的C ++应用程序时遇到了问题。

int checkIP(const char *IP)
{
    WSAData version;        //We need to check the version.
    WORD mkword=MAKEWORD(2,2);
    int what=WSAStartup(mkword,&version);
    if(what!=0){
        std::cout<<"This version is not supported! - \n"<<WSAGetLastError()<<std::endl;
    }
    else{
        std::cout<<"Good - Everything fine!\n"<<std::endl;
    }

    SOCKET u_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(u_sock==INVALID_SOCKET)
        std::cout<<"Creating socket fail\n";

    else
        std::cout<<"It was okay to create the socket\n";

    //Socket address information
    sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_addr.s_addr=inet_addr("192.168.0.90");
    addr.sin_port=htons(80);
    /*==========Addressing finished==========*/

    //Now we connect
    int conn=connect(u_sock,(SOCKADDR*)&addr,sizeof(addr));
    return conn;
}

这是我检查ip的功能。 我想并行运行这个功能。像

void start(const char* ip)
{
    while(checkIP == SOCKET_ERROR)
   {
       try to connect the ip...
   }
}

在我的主程序中我想运行这个启动函数,但我不想等待这个启动函数的响应...我需要这个函数应该调用并且平行地完成它的工作并且该程序如同。 ..

int Ipcheck = checkIP("192.168.10.90");
    if(Ipcheck == SOCKET_ERROR)
    {
        ofstream _Log;
        _Log.open ("Log.txt",std::ios_base::app);
        _Log << "Unable to connect to "<<IP<<endl;
        _Log.close();
        start();
        BSTR bstrr = SysAllocString(L"Error");
        return bstrr;
    }

就像在这段代码中系统调用start函数但我希望它jst调用函数并反手做每一件事并且编译器继续下一个语句BSTR立即返回值... 请帮我这样做...对不起我的英语不好...请给出示例代码如何以反手或平行的方式运行while循环事件...

2 个答案:

答案 0 :(得分:0)

要创建线程,请查看std :: thread

另请查看始终非常有用的文档 http://www.codeproject.com/Articles/540912/Cplusplus-Threads-Make-your-multitasking-life-e

通读本文,帮助您了解如何安全地创建线程,停止/避免数据争用和锁定线程。 在其他东西正在运行的时候,线程是很棒的东西,加速处理,在UI后面运行更新等等。

如果你还需要我在这里留言:) 杰克

答案 1 :(得分:0)

使用std::thread可能是一种解决方案。不管你真正想要做的是异步运行你的函数:在你等待真正需要返回值之前,你调用函数并做其他事情。

为此,std::async正是您所需要的!这里有一个关于这个主题的little tutorial

示例1:功能,没有返回值

    future<void> myvres = async(launch::async, start);  // launch function 
    DoSomethingElse(); 
    ... 
    myvres.get();     // here, make sure that start() finished.  

有趣的是,如果start()会引发异常,那么就会延迟到你执行get()的那一刻。

示例2:具有返回值的函数

    future<int> Ipcheck = async(launch::async, checkIP, "192.168.10.90");
    DoSomethingElse(); 
    ... 
    if (Ipcheck.get() == SOCKET_ERROR)   
       ...

但是,如果您正在寻找多线程,只是因为您不希望因套接字操作而延迟,那么thre是一个更简单的解决方案,即只是异步使用套接字。这里an example

相关问题