多线程函数重启模式/解决方案

时间:2013-07-10 17:16:57

标签: c++ multithreading

我有以下情况:

一个线程正在迭代X类方法A中的列表数据结构。该数据结构是一个缓存。在任何时候,我们都可以调用X类中的方法B,说我们的缓存已经过时了。在这种情况下,如果我们当前在函数A中,我们需要重新启动函数A,因为对该数据结构的迭代可以让我们找到不再存在的数据。我们可以指望方法B不会同时被调用两次(方法A将有时间完成)。

这可能吗?我正在使用C ++。请注意,仅仅锁定缓存是不够的。如果我们锁定缓存并且我们收到一条说缓存已过期的调用,我们需要立即重启函数A以获得正确的行为。

这不会正常工作,但我会尝试展示我需要的东西:

Class X
{
    Method A
    {
        for each //data structure
        {
            // do processing

            // check if our cache is out of date
            if(mRestart)
            {
                while(!mReadyToStart)
                    ; //wait

                mRestart = false;
                mReadyToStart = false;

                //Break, and call something that will recall this function.
            }                
            else
                return result; //return means we never needed to restart.
        }
    }

    Method B
    {
        mRestart = true;

        //Do processing

        mReadyToRestart = true;            
    }

    bool mRestart; // Init to false in constructor
}

1 个答案:

答案 0 :(得分:2)

您需要使用同步机制来保护mRestartmReadyToRestart成员以及您正在处理的数据结构,以防止并发访问。

根据您的特定需求,操作系统和构建环境,您可以使用c ++ 11标准互斥锁或条件变量,或其他低级操作系统方法或框架(例如boost :: thread)来实现这一点。< / p>