首页 > 解决方案 > 防止同时运行功能

问题描述

全部,

这是我正在寻找的伪代码:

class A : public Base
{
public:
    virtual int func();
    virtual int other_func();
};

class B : public Base
{
public:
    virtual int func();
    virtual int other_func();
};

class MainFrame
{
public:
    MainFrame();
    Base *CreateObject();
    int StartThread();
    int SomeOtherFunc();
private:
    Base *m_base;
};

MainFrame::MainFrame()
{
    m_base = NULL;
}

Base *MainFrame::CreateObject()
{
    if( <condition1> )
        m_base = new A();
    else
        m_base = new B();
}

int MainFrame::StartThread()
{
    int result;
    while( !TestDestroy() )
    {
        result = m_base->func();
        Sleep( 5000 );
    }
}

int MainFrame::SomeOtherFunc()
{
    m_base->other_func();
}

简而言之:我有 2 个类 A 和 B 派生自同一个基类。它们都有 2 个从 Base 重新定义的函数(实际上更多,但这无关紧要)。这些类中的每一个都位于其自己的 DLL 中。

我还有一个主要的 GUI 应用程序,它在某些条件下调用 A 或 B 的方法。它也会在某个时间点产生一个线程。在线程中,程序调用 A/B 类的函数。

现在我想做的是在执行 func() 时防止执行 other_func() 。

我可能应该为此使用互斥锁,但现在的问题是——我该如何设计它?我应该在函数本身内部还是在 MainFrame 方法内部的调用中实例化互斥锁?在这种情况下,互斥锁是否必须是全局变量?它可以是 Base 类的成员吗?

同样,从辅助线程发生的 func() 调用应该停止对 Base 的任何其他方法的调用,直到它完成。

蒂亚!

这是 C++11/MSVC 2010/gcc5.4。

[编辑]:

例如,请参阅以下问题并将其与以下代码进行比较:

std::mutex my_mutex;
int MainFrame::StartThread()
{
    int result;
    while( !TestDestroy() )
    {
        std::lock_guard<std::mutex> locker( my_mutex );
        result = m_base->func();
        Sleep( 5000 );
    }
}

int MainFrame::SomeOtherFunc()
{
    std::lock_guard<std::mutex> locker( my_mutex );
    m_base->other_func();
}

这两种解决方案之间有什么区别吗?它们都适用于我的目的吗 - 专门运行线程函数,阻止任何其他 A/B 函数执行?

[/编辑]

标签: multithreadingvisual-studio-2010c++11mutex

解决方案


推荐阅读