我有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函数,因为它实际上没有锁定函数。并且在执行实际操作之前,线程应遵循此规范。
答案 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现在没有运行