类变量在每个函数调用中都有默认值?

时间:2017-11-06 21:29:17

标签: c++ multithreading oop

MyClass中有两个功能。 FuncA发送要执行的命令,而FuncB检查执行FunA发送的命令的进度。当FuncB在while循环中等待,直到确保命令成功执行为止,我在一个单独的线程中调用FuncBFunA正在运行的线程不应该在while循环中等待。

main.cpp 中,有两个函数在两个不同的线程中运行。 execute做出决定,并在FunA调用check时致电FuncB发送命令,以检查已执行的决策。

由于我不希望execute多次发送相同的决定,我首先确保FuncA未运行且FuncB已重置funcInUsefalse

myclass.h

class MyClass
{
    public:
        MyClass();
        void FuncA(float x, floaty, floatz);
        bool FuncB(void);
        bool IsFuncInUse(void);
        void QuitFuncA(void);

    private:
        bool funcInUse;
        bool _x;
        std::mutex mtx;
}

myclass.cpp

MyClass::MyClass()
{
   funcInUse = false;
}

void MyClass::FuncA(float x, float y, float z)
{
    if(funcInUse == true)
    {
        printf("FuncA already in use\n");
        return;
    }
    // Gaining the lock, so that no two threads call the function at the same time
   mtx.lock();
    funcInUse = true;
   mtx.unlock();

    printf("INSIDE FuncA()::: %d\n", funcInUse?1:0);
    printf("THIS FuncA() adr=%p \n", this);

   // DO STUFF
}

bool MyClass::FuncB(void)
{
   if(funcInUse == true)
   {
    printf("THIS ISPOSREACHED() adr=%p \n", this);

    // DO STUFF

    // Giving the lock back before returning
   mtx.lock();
    funcInUse = false;
   mtx.unlock();

   printf("Function is no more in use\n");
   }

   return true;
}

bool MyClass:IsFuncInUse(void)
{
    return isFuncInUse;
}

void MyClass:QuitFuncA(void)
{
   mtx.lock();
    funcInUse = false;
   mtx.unlock();
}

的main.cpp

MyClass myClass;

void timerStart(std::function<void(void)> func, unsigned int interval)
{
    std::thread([func, interval]()
            { 
            while (true)
            { 
            auto x = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval);
            func();
            std::this_thread::sleep_until(x);
            }
            }).detach();
}

void execute(void)
{
   if(/*some special condition*/)
   {
       myClass.QuitFuncA();
   }

    if(myClass.isFuncInUse() == false)
    {
        // USE THE FUNCTION
        myClass.FuncA();
    }
}

void check(void)
{
    if(myClass.isFuncInUse())
    {
        status = myClass.FuncB();
        printf("STATUS %d\n", status?true:false);
    }
}

int main(void)
{
    timerStart(execute, 500);

    timerStart(check, 500);
}

问题FuncA在一次迭代中将funcInUse设置为true。在下一次迭代中,funcInUse再次为假,但FuncB未重置funcInUse。在两次迭代之间重置this会发生什么?

我在调用MyClass中的三个函数时尝试打印FuncA,并且所有函数都具有相同的地址。我也尝试使用类和我之前从here学习的类方法,但它没有用。

我尝试使用互斥锁,信号量和条件变量但是我遇到了FuncB应该获得互斥锁的问题,而MyClass应该在确保已执行已发送的命令后释放它(这不是允许使用互斥锁)。在一种情况下,isFuncInUse中的函数应重置funcInUse。有没有比使用var weatherData = entityContext.Weather .Include(x => x.Sensor) .Include(x => x.Position.Location) .ToList(); 变量更好的方法来同步两种方法?

谢谢

0 个答案:

没有答案