0

我在 C++ 中使用 tbb 编程。我不应该使用消息队列、FIFO、PIPES 等,因为它是特定于平台的。我应该使用 tbb 特定的 API。

Thread1: // Pseuodo code exits as below

     // I will take mutex

     m_bIsNewSubsArrived = true;
     StartSubscriptionTimer();
     m_bIsFristSubsArrived = true;  

     // Spawn a thread here.
     if(m_tbbTimerThread == NULL)
     {
        m_bIsTimerMutexTaken = true;
                m_timerMutex.lock(); 
        m_tbbTimerThread = new tbb::tbb_thread(&WaitForTimerMutex, this);
        if (m_tbbTimerThread->native_handle() == 0)
        {
            // report error and return.
            return;
        }
    }

    // Thread 1 exited.


In another thead I am releasing mutex which is taken above.

Thread 2.

 m_timerMutex.unlock();
 m_bIsTimerMutexTaken = false;


Thread 3: 

   // I am waiting for mutex 
    m_timerMutex.lock(); 

在上面的代码问题中,我认为线程 1 锁定的 m_timerMutex 没有被释放,所以我认为线程 2 无法解锁。线程 3 被永远阻塞。

我想我可以使用信号量,但是 TBB 中用于信号量的 API 是什么。

我可以在不睡觉和使用 tbb 特定 API 的情况下做到这一点的最佳技术是什么。

感谢您的时间和帮助。

4

2 回答 2

2

目前 TBB 中不支持信号量。原因是 TBB 旨在将原始线程之上的抽象级别提升到任务级别,而信号量被认为是线程编程的低级“goto”。请注意,C++11 也没有信号量。

使用任务而不是线程通常会使同步变得隐式,并且通常允许通过 TBB 中的工作窃取调度程序进行自动负载平衡。

如果您的问题不适用于基于任务的解决方案,请考虑使用条件变量,它是 C++11 的一部分。最新版本的 TBB 附带了C++11 条件变量的部分实现

于 2013-07-23T14:27:45.610 回答
1

我从来没有使用过 tbb,但通常你只能在当前持有它的线程中释放一个互斥锁(这是互斥锁的目的)。从这里显示的代码来看,Thread1仍然持有互斥锁,Thread2无法释放它,因为它没有持有它(不知道英特尔实现中的行为是什么,必须查找它)并且Thread3永远等待,因为Thread1仍然持有互斥锁。

(但我只是猜测,因为你没有告诉我们到目前为止你所拥有的代码实际发生了什么,或者你到底想要做什么)

于 2013-07-22T09:06:55.297 回答