线程和信号

问题描述 投票:-1回答:1

我有一个使用Boost-Thread的C ++ 98项目。主线程创建12个线程,如下所示:

for(int i=0;i<numCPU;++i)
{
    vThreads.push_back(new boost::thread(boost::bind(&TControl::startCPU,this,i,fnp)));
}

只要getWork()返回workunits,工作线程就会运行:

void startCPU(int id,StartFn fnp)
{
    unused(id);
    while(true)
    {
        WU_TYPE* pWU(getWork());
        if(pWU==NULL) return;
        CALL_MEMBER_FN(pWU,fnp)();  
    }
}

某些工作单元可能会运行很长时间。现在的目标是杀死运行时间已超过60分钟的工作单元,以便线程(运行void startCPU())可以启动新的工作单元。

最初我认为这可以通过信号完成,即主线程可以每分钟发出一个信号,每个线程内的信号处理程序可能会为过期的工作单元抛出异常。但是经过一点阅读它似乎不会像这样工作,因为从一个线程引发的信号不会启动另一个线程的信号处理程序,对吧?实现这一目标的适当技术是什么?

注意:C ++ 11不可用,软件必须在旧系统上编译。

c++ multithreading signals boost-thread
1个回答
0
投票

如果没有当前在线程中运行的代码的支持,则无法完成。线程共享进程上下文。他们获取锁,然后破坏上下文,他们必须在释放锁之前将上下文返回到一个理智状态,否则进程上下文将被损坏。因此,如果没有当前运行的代码的合作,你就无法杀死一个线程。

通过合作,您可以使用它支持的任何方法。如果代码支持Boost的interrupt函数,则可以使用它。代码必须实现“中断点”,检查它是否被中断并干净地终止线程 - 否则,interrupt将不会做任何事情。如果它支持其他一些机制,请使用它。但它必须从头开始设计。

否则,使用进程而不是线程隔离代码。只要你没有做任何奇怪的事情(比如与它共享内存),你就可以终止进程。

© www.soinside.com 2019 - 2024. All rights reserved.