具有特定超时的{std}

时间:2015-05-20 06:55:23

标签: c++ c++11 visual-studio-2012 std stdthread

目前我开始我的线程并等待它完成:

void ClassA::StartTest() // btn click from GUI
{
    ClassB classB;

    std::vector<std::thread> threads;
    for(int counter=0; counter<4; counter++)
    {
        threads.at(counter) = std::thread(&ClassB::ExecuteTest, classB);
        // if I join the threads here -> no parallelism
    }

    // wait for threads to finish
    for(auto it=threads.begin(); it!=threads.end(); it++)
        it->join();
}

ClassB的

#include <mutex>

ClassB
{
public:
    void ExecuteTest(); // thread function
private:
    std::mutex m_mutex;
    bool ExecuteOtherWork(std::string &value);
};

相关方法ExecuteTest()

void ClassB::ExecuteTest()
{
    std::string tmp;

    std::lock_guard<std::mutex> lock(m_mutex); // lock mutex
    std::stringstream stream(pathToFile);

    while(getline(stream, tmp, ',')) // read some comma sep stuff 
    {
        if(!ExecuteOtherWork(tmp)) break;
    }
}

一切都好,但是我希望有一个线程超时:让我们说40秒后线程必须退出那里工作并返回主线程。 我怎么能这样做?

THX!

1 个答案:

答案 0 :(得分:0)

在while循环中添加一个超时检查:

std::chrono::time_point<std::chrono::steady_clock> start(std::chrono::steady_clock::now());
std::chrono::seconds timeout(timeoutinSec);
while(getline(stream, tmp, ',') && std::chrono::steady_clock::now() - start < timeout) // read some comma sep stuff 
{
    if(!ExecuteOtherWork(tmp)) break;
}

如果ExecuteOtherWork()是一个快速操作,那么你可以检查循环每执行X次的时间。