如何使用 Thread 运行类构造函数

How to use Thread to run a class Constructor

本文关键字:构造函数 运行 Thread 何使用      更新时间:2023-10-16

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

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

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

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

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

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

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

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
    }
}
您可以使用

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) ...

您可以使用 pthreads 启动该过程,当您不再喜欢您的线程时,您可以使用pthread_cancel将其杀死

伪代码

start thread
wait
cancel thread if not finished