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

C++ 多线程函数重启模式/解决方案,c++,multithreading,C++,Multithreading,我有以下情况: 一个线程正在迭代类X的方法a中的列表数据结构。该数据结构是一个缓存。在任何时候,我们都可以调用类X中的方法B,说我们的缓存已过期。在这种情况下,如果我们当前在函数A中,我们需要重新启动函数A,因为在该数据结构上的迭代可以帮助我们找到不再存在的数据。我们可以指望方法B不会同时被调用两次(方法A将有时间完成) 这可能吗?我正在用C++工作。请注意,仅仅锁定缓存是不够的。如果我们锁定了缓存,并且接到一个电话说缓存已过期,我们需要立即重新启动一个函数以获得正确的行为 这可能无法正常工作,

我有以下情况:

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

这可能吗?我正在用C++工作。请注意,仅仅锁定缓存是不够的。如果我们锁定了缓存,并且接到一个电话说缓存已过期,我们需要立即重新启动一个函数以获得正确的行为

这可能无法正常工作,但我将尝试显示我需要什么:

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
}

您需要使用同步机制来保护
mRestart
mReadyToRestart
成员和您正在处理的数据结构不受并发访问


<> P>根据您的特殊需要,OS和构建环境,您可以使用C++ 11标准互斥体或条件变量,或其他低级OS方法,或框架(例如:Boo::线程)来实现C++中的这个。当缓存过期时,我如何在方法A的关键部分中发现?有一个“缓存有效”指示器(例如,作为条件变量),您将检查
for
循环中的每个迭代,如果设置为false,则退出(如果不适合,请更详细地解释您考虑的关键部分).我没有明确地说“使用互斥锁”。例如,对于这类东西,信号量是很好(更好?)的同步机制,因为您可以使用“广播”机制将源(缓存)中的更改通知任何阻塞接收器等待者。不幸的是,c++11标准没有提供信号量类或类似的类,但是您可以使用特殊的条件变量实现轻松地模拟它。。。。合适的读写器锁模型也可以适合您的用例。取决于
//D(D)o处理的细节。我希望我给了一些有用的提示。。。