2013-07-22 116 views
0

我在C++中使用tbb編程。我不應該使用消息隊列,FIFO,PIPES等,因爲它是特定於平臺的。我應該使用tbb特定的API。使用tbb線程之間的同步

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不relased所以我覺得線程2都不能夠開鎖。線程3永遠被阻止。

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

什麼是最好的技術,我可以做到這一點與睡覺和使用tbb特定的API。

感謝您的時間和幫助。

+0

你不能使用[concurrent_queue_cls](http://software.intel.com/sites/products/documentation/doclib/tbb_sa/help/reference/containers_overview/concurrent_queue_cls.htm) - 它基本上是一個消息隊列。 –

回答

1

我從來沒有用過tbb,但通常你只能在當前擁有它的線程中釋放一個互斥量(這是一種互斥量的目的)。從這裏顯示的代碼中,Thread1仍然持有該互斥鎖,Thread2無法釋放它,因爲它不支持它(不知道在英特爾實施中存在什麼行爲,必須查看這個),並且Thread3是因爲Thread1仍然持有互斥體,所以一直在等待。

2

目前還沒有支持(不過我只是猜測,因爲你沒有告訴我們什麼實際上到目前爲止,你已經得到了代碼,或者正是你正在嘗試做的事情)用於TBB中的信號量。原因在於TBB旨在將原始線程的抽象級別提高到任務級別,信號量被認爲是線程編程的低級「轉向」。請注意,C++ 11也沒有信號量。

使用任務而不是線程通常允許同步變爲隱式,並且通常允許通過TBB中的工作竊取調度程序進行自動負載平衡。

如果您的問題不適合基於任務的解決方案,請考慮使用條件變量,它們是C++ 11的一部分。 TBB的最新版本帶有C++ 11條件變量的partial implementation