线程和信号

Threads and Signals

本文关键字:信号 线程      更新时间:2023-10-16

我有一个使用boost线程的C 98项目。主线程创建了这样的12个线程:

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

和工作线程只要getWork()返回工作单元即可运行:

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不可用,软件必须在旧系统上编译。

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

与其合作,您可以使用它支持的任何方法。如果代码支持Boost的中断功能,则可以使用它。代码必须实现"中断点",检查它是否已中断并清洁终止线程 - 否则,interrupt不会做任何事情。如果它支持其他机制,请使用它。但必须从一开始就设计。

否则,用过程而不是线程隔离代码。只要您不做任何怪异的事情(例如与之共享内存),您可以终止一个过程。