我正在使用信号来测试是否存在非法指令:
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计时器可用,那么我不需要该线程,所以我希望能够有条件地创建该线程。
答案 0 :(得分:0)
myTimer
超出范围并在结束时销毁。 std::thread
个join()
个实例的A destructor未经detach()
或terminate()
来电signal()
。
{
"id":2,
"name":"hari"
}
{
"id":4,
"name":"kumar"
}
与此无关。将变量放入一个短命的范围就可以了。