假设我有两个线程和一个共享C++ 11条件变量。 如果thread1调用notify并在那个thread2调用等待之后会发生什么? 将永久thread2块,否则它将继续它的工作由于thread1的通知调用?如果我呼叫等待通知条件变量,会发生什么
编辑:
enum bcLockOperation
{
bcLockOperation_Light = -1,
bcLockOperation_Medium = 50,
bcLockOperation_Heavy = 1
}
class BC_COREDLL_EXP bcCustomMutex
{
private:
bcCustomMutex(const bcCustomMutex&);
bcCustomMutex& operator=(const bcCustomMutex&);
protected:
bcAtomic<int> mFlag;
bcMutex mMutex;
bcConditionVariable mCond;
public:
bcCustomMutex() { bcAtomicOperation::bcAtomicInit(mFlag, 0); };
~bcCustomMutex() {};
/*bcMutex(const bcMutex& pOther) = delete;
bcMutex& operator=(const bcMutex& pOther) = delete;*/
bcInline void lock(bcLockOperation pLockOperation = bcLockOperation_Medium)
{
bcINT32 lNewLoopCount = static_cast<bcINT32>(pLockOperation);
bcINT32 lLoopCounter = 0;
bcINT32 lExpected = 0;
bcINT32 lLoopCount = bcAtomicOperation::bcAtomicLoad(mFlag, bcMemoryOrder_Relaxed);
while (true)
{
while(bcAtomicOperation::bcAtomicLoad(mFlag, bcMemoryOrder_Relaxed) != 0 &&
lLoopCounter != lLoopCount)
++lLoopCounter;
bcAtomicOperation::bcAtomicCompareExchangeStrong(
mFlag,
&lExpected,
lNewLoopCount,
bcMemoryOrder_Acquire,
bcMemoryOrder_Relaxed);
if(lExpected == 0)
{
//mMutex.lock();
return;
}
else if(lLoopCounter == lLoopCount)
{
bcLockGuard<bcMutex> lGuard(mMutex);
mCond.wait(mMutex);
}
else
continue;
}
};
bcInline void UnLock()
{
bcAtomicOperation::bcAtomicStore(mFlag, 0, bcMemoryOrder_Relaxed);
bcUniqueLock<bcMutex> lGuard(mMutex);
mCond.notifyOne();
};
bcInline bcBOOL TryLock()
{
};
};
我想写一个自定义的互斥使得每个线程都可以提供表示操作的当前线程要执行复杂的参数。 如果操作的复杂度较低,其他线程将像循环锁一样处于循环状态,但如果操作的复杂度为中等,则每个线程将迭代50次,然后通过条件变量休眠,如果操作非常复杂,则其他线程会直接睡觉。
现在假设线程1个锁定这个互斥及线程无二由于等待其循环计数器达到其最终和右锁定条件变量的互斥体之前,线程1调用条件变量通知。现在thread2会睡眠,直到另一个线程锁定自定义互斥锁,然后调用它解锁。
我新的多线程和我想学习。我知道我的类可能包含错误或者可能是完全错误的,但是有什么方法可以纠正这个问题或者写一个这样的互斥体的好算法。
另一个问题是:是我的原子操作正确排序?
你可以自己尝试,对吧? –
是的,你是对的!但我的笔记本电脑有问题,我正在修理它。现在我正在考虑我的问题,直到我可以编写代码。对不起 – MRB
没有“通知条件变量”这样的事情。了解条件变量最重要的是它们是无状态的。 –