如果我呼叫等待通知的条件变量会发生什么

MRB

假设我有两个线程和一个共享的c ++ 11条件变量。如果thread1调用通知并且在该thread2调用等待之后会发生什么?由于thread1的notify调用,thread2会永远阻塞还是继续工作?

编辑:

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() {};

    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)
            {
                return;
            }
            else if(lLoopCounter == lLoopCount)
            {
                bcLockGuard<bcMutex> lGuard(mMutex);
                mCond.wait(mMutex);                           
            }
            else
            {
                continue;
            }
        }

        void UnLock() 
        { 
            bcAtomicOperation::bcAtomicStore(mFlag, 0, bcMemoryOrder_Relaxed);
            bcUniqueLock<bcMutex> lGuard(mMutex);
            mCond.notifyOne();
        }

        bcBOOL TryLock() 
        {
        };
    };

我想编写一个自定义的互斥锁,以便每个线程都可以提供一个参数,该参数表示当前线程要执行的操作的复杂性。如果操作的复杂度较低,则其他线程将像自旋锁一样处于循环状态,但是如果操作的复杂度中等,则每个线程将迭代50次,然后将通过条件变量进行睡眠,如果操作非常复杂,其他线程将直接去睡觉。

现在假设线程1锁定了该互斥锁,并且线程2由于其loopCounter到达其末尾而一直等待,然后再锁定条件变量的互斥锁,线程1会在条件变量上进行通知。现在,thread2将进入睡眠状态,直到另一个线程锁定了自定义互斥锁,然后对其调用unlock。

我是多线程新手,我想学习。我知道我的班级可能包含错误或可能完全错误,但是有什么方法可以纠正此问题,也可以使用一种好的算法编写此类互斥量。

皮特·贝克尔

Thread2将阻塞,直到有人打电话通知。调用以通知在调用时正在等待的释放线程。如果没有线程在等待,它们什么也不做。他们没有被保存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

调用通知的线程会发生什么

来自分类Dev

等待失败的任务会发生什么

来自分类Dev

如果C#中的Catch块中发生异常,会发生什么情况。在这种情况下,呼叫者也会得到什么结果

来自分类Dev

如果我使用非最终的ConcurrentHashMap会发生什么

来自分类Dev

如果ThreadPool线程死亡,会发生什么?

来自分类Dev

处置呼叫者之前未完成的等待呼叫会发生什么情况?

来自分类Dev

等待条件变量的线程持有的互斥锁会发生什么情况

来自分类Dev

如果我超出Java中变量的限制,会发生什么?

来自分类Dev

如果我不销毁信号灯,会发生什么?

来自分类Dev

如果我不清除stringstream,会发生什么?

来自分类Dev

如果将太多的require()传递给变量,会发生什么?

来自分类Dev

如果我多次调用C的read()会发生什么?

来自分类Dev

等待加入条件变量的线程会发生什么情况?

来自分类Dev

如果我的映像大于Firebase Storage的maxSize,会发生什么?

来自分类Dev

如果我在fortran中调用一个函数而未定义变量,会发生什么?

来自分类Dev

如果我的邻居将他的wifi SSID设置为我的wifi SSID,会发生什么?

来自分类Dev

如果ThreadPool线程死亡,会发生什么?

来自分类Dev

如果未设置枚举,会发生什么?

来自分类Dev

Heroku:如果全部使用我的Redis连接会发生什么?

来自分类Dev

如果我超出Java中变量的限制,会发生什么?

来自分类Dev

如果我在登录时导出$ HOME变量,将会发生什么?

来自分类Dev

如果函数也是MATLAB中的变量,会发生什么?

来自分类Dev

如果我在无限循环中启动线程会发生什么?

来自分类Dev

如果我不使用deletelater删除qthread会发生什么?

来自分类Dev

如果我的过程未定义变量,但在共享库中用作外部变量,会发生什么情况?

来自分类Dev

如果我尝试获取未定义变量的sizeof会发生什么?(PHP)

来自分类Dev

如果 QTimer 不停止会发生什么

来自分类Dev

如果我安装 Wayland 会发生什么?

来自分类Dev

如果我在“同步”之前关闭设备会发生什么?

Related 相关文章

  1. 1

    调用通知的线程会发生什么

  2. 2

    等待失败的任务会发生什么

  3. 3

    如果C#中的Catch块中发生异常,会发生什么情况。在这种情况下,呼叫者也会得到什么结果

  4. 4

    如果我使用非最终的ConcurrentHashMap会发生什么

  5. 5

    如果ThreadPool线程死亡,会发生什么?

  6. 6

    处置呼叫者之前未完成的等待呼叫会发生什么情况?

  7. 7

    等待条件变量的线程持有的互斥锁会发生什么情况

  8. 8

    如果我超出Java中变量的限制,会发生什么?

  9. 9

    如果我不销毁信号灯,会发生什么?

  10. 10

    如果我不清除stringstream,会发生什么?

  11. 11

    如果将太多的require()传递给变量,会发生什么?

  12. 12

    如果我多次调用C的read()会发生什么?

  13. 13

    等待加入条件变量的线程会发生什么情况?

  14. 14

    如果我的映像大于Firebase Storage的maxSize,会发生什么?

  15. 15

    如果我在fortran中调用一个函数而未定义变量,会发生什么?

  16. 16

    如果我的邻居将他的wifi SSID设置为我的wifi SSID,会发生什么?

  17. 17

    如果ThreadPool线程死亡,会发生什么?

  18. 18

    如果未设置枚举,会发生什么?

  19. 19

    Heroku:如果全部使用我的Redis连接会发生什么?

  20. 20

    如果我超出Java中变量的限制,会发生什么?

  21. 21

    如果我在登录时导出$ HOME变量,将会发生什么?

  22. 22

    如果函数也是MATLAB中的变量,会发生什么?

  23. 23

    如果我在无限循环中启动线程会发生什么?

  24. 24

    如果我不使用deletelater删除qthread会发生什么?

  25. 25

    如果我的过程未定义变量,但在共享库中用作外部变量,会发生什么情况?

  26. 26

    如果我尝试获取未定义变量的sizeof会发生什么?(PHP)

  27. 27

    如果 QTimer 不停止会发生什么

  28. 28

    如果我安装 Wayland 会发生什么?

  29. 29

    如果我在“同步”之前关闭设备会发生什么?

热门标签

归档