使用tbb在线程之间进行同步

时间:2013-07-22 07:36:44

标签: c++ tbb

我在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(); 

在上面的代码问题中,我认为是锁定m_timerMutex的线程1没有被重新关联,所以我认为thread2无法解锁。并且线程3永远被阻止。

我想我可以使用sempahore,但是在TBB中用于sempahore的API是什么。

在睡眠和使用tbb特定API的情况下,我可以做到的最好的技术是什么。

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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