【问题标题】:Multithreading in VS2010VS2010 中的多线程
【发布时间】:2017-09-01 12:48:45
【问题描述】:

我有一个在 VS2010 中创建的 C++ DLL。此 DLL 负责生成报告并将其发送到服务器。此 DLL 由实际创建数据的另一个应用程序调用。由于将文件发送到服务器需要一些时间,因此我不希望调用应用程序等到 DLL 忙于将文件发送到服务器。

为了处理上述问题,我想将发送文件到服务器的任务(只是一个小功能)分配给一个单独的线程,并且不想等待这个线程完成(否则没有好处) .

while(UserShutDownTheApp)
{
    - Main App Gather Data 
    - Main App Call data management DLL and pass data to it
        - DataManagementDLL: Generate a Report
        - DataManagementDLL: Start a THREAD and Send report to Server by this THREAD. Do not wait for this THREAD to complete
    - Main App finishes this iteration and is going to enter into next iteration.    
}

由于我无法控制主调用应用程序,因此我只能在 DLL 内部进行修改。我很困惑我应该如何实现这个逻辑?我的意思是,如果线程没有完成将文件发送到服务器的任务,同时主调用应用程序已经第二次调用了这个DLL,会发生什么。

【问题讨论】:

    标签: c++ windows multithreading visual-studio-2010


    【解决方案1】:

    不清楚你的所有约束,但这是一个在 c++ 中使用线程的简单示例:

    void sendreport(std::string data)
    {
        std::cout << "send " << data;
        std::this_thread::sleep_for(std::chrono::seconds(10));
    
    }
    
    std::queue<std::thread> jobs;
    
    void addjob(std::string data)
    {
        while (jobs.size() > 10)
        {
            jobs.front().join();
            jobs.pop();
        }
    
        jobs.emplace(sendreport, data);
    }
    
    void waitalljobs()
    {
        while (jobs.size() > 0)
        {
            jobs.front().join();
            jobs.pop();
        }
    }
    
    
    int main()
    {
    
        addjob("first");
        addjob("second");
        waitalljobs();
    }
    

    在这个示例中,我使用了一个队列,并将当前线程的数量限制为 10。 在程序终止时,waitalljobs 等待所有线程完成它们的工作。

    【讨论】:

    【解决方案2】:

    您应该在 DLL 中添加更多逻辑。首先,对DLL的调用不应该直接将数据发送到服务器,而是将任务排队(只需将所有传递的数据添加到内部队列中)。 DLL 可以有内部工作线程,它应该负责处理任务队列。

    内部实现和架构应该是什么样子,取决于现有 API(是否可修改)。

    提示 - 请查看 DllMain() https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx - 作为入口点应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多