C ++使用std :: signal后无法创建std :: thread

时间:2018-01-22 03:27:27

标签: multithreading visual-c++ signals

我正在使用信号来测试是否存在非法指令:

std :: signal(SIGILL,signalHandler);

如果signalHandler失败,那么我创建一个循环计数器计时器线程:

std :: thread myTimer(aTimer);

如果我在信号测试之前创建线程一切正常,但如果我在使用信号后尝试创建线程,程序将被中止。

这是代码

int Use_rdtscp = 0;

void aTimer(void)
{
    for (timerCounter = 0; ; timerCounter++);
}

typedef void(*SignalHandlerPointer)(int);
static SignalHandlerPointer previousHandler;

void SignalHandler(int signal)
{
    throw "Illegal instruction!";
}

void Test_stdscp_function(void)
{
    register uint64_t time1;
    uint32_t junk = 0;

    std::signal(SIGILL, SignalHandler);

    try
    {
        time1 = __rdtscp(&junk); /* READ TIMER */
        printf("rdtscp timer is available.\n");
        Use_rdtscp = 1;
    }
    catch (...)
    {
        printf("rdtscp timer is not available. Using counter timer.\n");
        std::signal(SIGILL, SIG_DFL);
        Use_rdtscp = 0;
    }
}

int main(int argc, const char **argv) {
    int testing = 0;
    //std::thread myTimer(aTimer); // works here

    Test_stdscp_function();

    if (Use_rdtscp == 0)
    {
        std::thread myTimer(aTimer); // but fails if moved to here
    }

如果stdscp计时器可用,那么我不需要该线程,所以我希望能够有条件地创建该线程。

1 个答案:

答案 0 :(得分:0)

myTimer超出范围并在结束时销毁。 std::threadjoin()个实例的A destructor未经detach()terminate()来电signal()

{ "id":2, "name":"hari" } { "id":4, "name":"kumar" } 与此无关。将变量放入一个短命的范围就可以了。