[英]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.