用另一个超时线程杀死Boost线程

时间:2014-03-31 13:42:06

标签: multithreading boost boost-thread

我希望在经过一段时间后结束一个帖子WorkerThread。 我想为此使用第二个线程TimeoutThread,在15秒后更改一个标志,以便另一个线程停止。 有没有更优雅的方式来提升这一点?

#include <boost/thread.hpp>

struct MyClass
{
    boost::thread timeoutThread;
    boost::thread workerThread;
    bool btimeout = true;

    void run()
    {
     timeoutThread = boost::thread(boost::bind(&MyClass::TimeoutThread, this));
      workerThread  = boost::thread(boost::bind(&MyClass::WorkerThread, this));
     workerThread.join();
     TimeoutThread.join();
    }


    void WorkerThread() {

        while(boost::this_thread::interruption_requested() == false && btimeout) 
        {
            printf(".");

        }
    }

    void TimeoutThread() 
    {
        boost::this_thread::disable_interruption oDisableInterruption;
        DWORD nStartTime = GetTickCount();

        while(boost::this_thread::interruption_requested() == false) 
        {
            if(GetTickCount() - nStartTime > 15)
            {
                m_bTimeout = false;
                break;
            }
        }

    }
};

int main()
{
    MyClass x;
    x.run();
}

2 个答案:

答案 0 :(得分:1)

你可以使用睡眠:

#include <boost/thread.hpp>

struct MyClass
{
    boost::thread timeoutThread;
    boost::thread workerThread;

    void TimeoutThread() {
        boost::this_thread::sleep_for(boost::chrono::milliseconds(15));
        workerThread.interrupt();
    }

    void WorkerThread() {
        while(!boost::this_thread::interruption_requested())
        {
            //Do stuff
        }
    }

    void run()
    {
        timeoutThread = boost::thread(boost::bind(&MyClass::TimeoutThread, this));
        workerThread  = boost::thread(boost::bind(&MyClass::WorkerThread, this));
        workerThread.join();
        timeoutThread.join();
    }
};

int main()
{
    MyClass x;
    x.run();
}

这具有便携性的最小好处。

查看 live on Coliru

请注意Boost Asio中的deadline_timer课程。

看起来你正试图在你的工作线程中等待一个条件。如果是这样,您还可以等待condition_variable的截止日期(cv.wait_until或超时:cv.wait_for)。

答案 1 :(得分:0)

只需检查工作线程中的时间,您就不需要单独的超时线程:

void WorkerThread() 
{
    DWORD nStartTime = GetTickCount();
    while(boost::this_thread::interruption_requested() == false && GetTickCount() - nStartTime < 15000) 
    {
        printf(".");

    }
}

BTW,请注意15000,因为GetTickCount()单位毫秒