如何使用Thread来运行类Constructor

时间:2017-10-26 12:48:31

标签: c++ multithreading c++11 eclipse-cdt

有没有办法在单独的线程中构造具有特定参数的类?

在我看到的例子中,我只能看到线程运行函数和成员函数。更具体地说,我需要它在一个单独的线程中运行这个构造函数:

 Thermistor(ukd_Adc * pAdc,
            const lookup_table_t * pLUT,
            uint8_t numOfLutElements);

我想在不同的线程中构造类来断言功能并检查边缘情况。

如果有一个像ukd_Adc的指针那样的边缘情况为NULL,那么断言会使它挂在无限循环中。这个线程允​​许我设置构造函数可以运行多长时间的时间限制,这样它就不会进入无限循环。

这是出于测试目的,因为根据我的知识,谷歌测试没有超时功能。

3 个答案:

答案 0 :(得分:3)

如果您只想在单独的线程上构造一个对象并检查它是否已在特定时间约束内成功完成,请使用:

int main() { 
    std::promise<std::shared_ptr<Thermistor>> promise;
    std::future<std::shared_ptr<Thermistor>> future = promise.get_future();
    std::thread([&promise](ukd_Adc * pAdc,
                           const lookup_table_t * pLUT,
                           uint8_t numOfLutElements) {
      promise.set_value_at_thread_exit(std::make_shared<Thermistor>(pAdc, pLUT, numOfLutElements));
    }, <pAdc-value>, <pLUT-value>, <numOfLutElements-value>).detach();

    auto status = future.wait_for(std::chrono::seconds(3));
    if (status == std::future_status::ready)
    {
        // succeeded
    }
    else
    {
        // failed
    }
}

答案 1 :(得分:0)

您可以使用alarm()功能在指定的时间后发出信号(SIGALRM):

static bool alarmed = false;
extern "C" void handler(int signo)
{
    alarmed = true;
}
signal(SIGALRM, handler);
alarm(5); // seconds to SIGALRM
// do stuff
// if (alarmed) ...

答案 2 :(得分:0)

您可以使用pthread启动该过程,当您不再喜欢您的主题时,可以使用pthread_cancel

将其删除

伪代码

start thread
wait
cancel thread if not finished