C ++如何在多线程中获取状态

时间:2013-08-23 06:10:40

标签: c++ multithreading

我有3个线程可能同时运行,现在我想控制它们的运行逻辑如下。

1)thread1,thread2,thread3是3种耗时的线程,我想当时只运行1。 和thread1也是自身独占的,这意味着如果一个thread1正在运行,第二个thread1也将不会运行。

2)我想知道当前运行的线程信息,(例如,哪种线程正在运行) 例如,当thread1正在运行时,现在在运行thread2之前,我想检查当前是否有线程在运行,我还想知道当前正在运行哪个线程(在这个示例中,我想知道thread1正在运行),如果有a1运行,我将不会运行thread2,并返回状态。

基于上面的内容,我在下面定义了锁类。

enum LOCK_TYPE{
    Type_UnLock = 0,
    Type_Lock_1,
    Type_Lock_2,
    Type_Lock_3,
};

//uCurLockType is a reference, when locked by others, 
//it will store current lock type and return.
std::unique_lock<std::mutex> g_lock(g_mutex, std::defer_lock);

bool CXXXLock::Lock(LOCK_TYPE uToLockType, LOCK_TYPE& uCurLockType)
{
    if(m_uLockType != LOCK_TYPE::Type_UnLock)
    {
        uCurLockType = m_uLockType;
        return false;
    }
    if(g_lock.try_lock())
    {
        m_uLockType = uToLockType;
        g_lock.unlock();
        return true;
    }
    else
    {
        uCurLockType = m_uLockType;
        return false;
    }
}

bool CXXXLock::Unlock()
{
   if(g_lock.try_lock())
   {
       m_uLockType = LOCK_TYPE::Type_UnLock;
       g_lock.unlock();
       return true;
   }
   else
   {
       return false;
   }

}

在thread1 proc函数中,它将调用如下。它也类似于thread2 / thread3 proc函数,GetInstance()是一个单例,并将获得唯一的全局对象。

unsigned thread1proc(LPVOID lpParam)
{
    LOCK_TYPE uToLockType = LOCK_TYPE::Type_Lock_1, uCurLockType = LOCK_TYPE::Type_UnLock;
    if(false == GetInstance().Lock(uToLockType, uCurLockType))
    {
        //it is locked by other thead, uCurLockType means which kind of thread lock it.
        //store current lock type uCurLockType and exit this thread.
        return;
    }

    //  do thread logic

    GetInstanct().Unlock();
    return;
}

我测试后,似乎工作正常,但是,我想知道这是否是标准的方法。 任何评论表示赞赏。

------ 2013.8.23更新CXXXLock实现--------

------ -------- 2031.8.36

似乎我已经定义了一些会让人困惑的错误函数,对于我的要求,它似乎看起来像CXXXXLock :: GetExclusiveFlag而不是CXXXLock :: Lock函数,因为它实际上没有锁定函数。并且在执行实际操作之前,线程应遵循此规范。

1 个答案:

答案 0 :(得分:0)

  

- 我希望当时只运行1

     

- 为什么你需要多个线程?

     

- 嗯,您可以认为有3个模块,他们将启动每个线程,我们不希望它们同时运行。我们不能   控制每个模块何时启动线程。

我可以想到线程想要不同时运行的一个可能原因。这是他们在相同的共享资源上运行的情况。在这种情况下,为了防止数据争用,您可以使用例如mutex对象。 Thread-1锁定mutex,对共享数据执行一些操作,然后解锁它。线程2将尝试锁定该静音,并等待线程1解锁mutex如果它被锁定。

在您提到的评论中,您必须同步几种类型的操作。在这种情况下,您应该将N个mutex对象用于N种类型的锁(操作)。如果mutex_1被锁定,则表示operation_1正在运行。如果mutex_2被锁定,则意味着operation_2正在运行。如果mutex_n未锁定,则表示operation_n现在没有运行