我在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的情况下,我可以做到的最好的技术是什么。
感谢您的时间和帮助。
答案 0 :(得分:2)
TBB目前不支持信号量。原因是TBB旨在将原始线程之上的抽象级别提升到任务级别,并且信号量被认为是线程编程的低级“转向”。请注意,C ++ 11也没有信号量。
使用任务而不是线程通常允许同步变为隐式,并且通常允许通过TBB中的工作窃取调度程序进行自动负载平衡。
如果您的问题不适合基于任务的解决方案,请考虑使用条件变量,它们是C ++ 11的一部分。最近版本的TBB附带了partial implementation个C ++ 11条件变量。
答案 1 :(得分:1)
我从未使用过tbb,但通常只能在当前持有它的线程中释放一个互斥锁(这是互斥的目的)。从此处显示的代码开始,Thread1
仍然保留互斥锁,Thread2
无法释放它,因为它没有保留它(不知道那里的行为是什么在英特尔实现中,必须查看此内容并且Thread3
正在等待,因为Thread1
仍然持有互斥锁。
(但我只是在猜测,因为你没有告诉我们你到目前为止所做的代码到底发生了什么,或者你究竟想要做什么)