簡體   English   中英

在多線程環境中使用CList

[英]Using CList in a multithreaded environment

我在多線程環境中使用CList,但GetHead方法始終有問題。 我有一個線程將數據添加到列表中,另一個線程從列表中讀取和刪除數據。 這是閱讀部分:

 value_type get_next()  
        {
          T t;
          if(!queue.IsEmpty()) {
             t = queue.GetHead();
          }
          return t;  //If the queue is empty we return an empty element
        }

這是插入部分:

 inline void insert(T &_in) 
        {
          queue.AddTail(_in);
        } 

這是去除部分

  inline void  pop_next()  
        {
          if(!queue.IsEmpty())  {
            queue.RemoveHead(); 
          }
        }

為什么運行此命令時會出現運行時錯誤。 它總是在失敗

t = queue.GetHead();

有了這個斷言:

template<class TYPE, class ARG_TYPE>
AFX_INLINE TYPE& CList<TYPE, ARG_TYPE>::GetHead()
    { ENSURE(m_pNodeHead != NULL);
        return m_pNodeHead->data; }

雖然m_pNodeHead的值為:

  • pNext 0x00000000 {pNext = ??? pPrev = ??? data = {...}} CList>> ,, ATL :: CStringT>>&> :: CNode *
  • pPrev 0x00000000 {pNext = ??? pPrev = ??? data = {...}} CList>> ,, ATL :: CStringT>>&> :: CNode *
  • 數據“” TESTSETSE ATL :: CStringT>>

您在插入和檢索值之間有一個競爭條件。 添加一個包含get_next(),insert()和pop_next()整個主體的鎖。

CList不是線程安全的-您需要在代碼的那些關鍵部分使用關鍵部分來檢查隊列的狀態,然后對其進行處理。

另外,為什么與隊列中用於刪除項目的位相比,與隊列中的項目使用不同的位?

不要嘗試在非GUI線程中執行GUI任務。 GUI線程只有一個線程(通常)。 帶有消息泵的線程。 換句話說,主線程。

您的工作線程應向主線程發送某種信號,然后該主線程會在列表框中添加和刪除項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM