2013-11-01 34 views
0

類定義多線程程序會導致段故障,使用的std ::目錄::的push_back

class TaskWorker 
{ 
    ... 
    private: 
      std::list<client_det*> clientList; 
    ... 

    public: 
      void waitForClientResponse(); 
}; 

功能運行類的成員函數作爲線程

void* waitForResponse(void* w) 
{ 
    TaskWorker* worker = static_cast<TaskWorker*>(w); 
    worker->waitForClientResponse(); 
} 

線程函數實現

void TaskWorker::waitForClientResponse() 
{ 
    client_det* obj = new client_det(); 
    ... 
    clientList.push_back(obj); //valgrind says access violation 
    ... 
} 

這個實現有什麼問題嗎?
訪問私有成員列表的線程類成員函數是否有任何限制?

線程調用

int TaskWorker::assign_and_wait(std::list<MulticastGroupInfo*> groupList) 
{ 
    ... 
    ...    
    pthread_t tid; 
    pthread_create(&tid, NULL, waitForResponse, this); 
} 

更新

我編譯代碼,無需調試符號和碰撞吸走了。這是我最近的觀察。
任何人都可以啓發我這裏發生了什麼?

+0

你確定'w'不是'NULL'嗎? – HAL

+0

@HAL我添加了調用線程函數的代碼。我從另一個成員函數傳遞'this'。是對的嗎? – cppcoder

+0

有多少線程試圖同時修改'clientList'? – Bill

回答

1

這裏是可以在你的代碼導致段錯誤的幾件事情:

  • TaskWorker實例可能是NULL,因爲在void* waitForResponse(void* w)沒有空檢查。在第一次訪問成員變量時,這可能會在void TaskWorker::waitForClientResponse()中導致訪問衝突。

  • 請避免任何不安全的C風格字符串操作。例如,如果使用strcpy時不夠小心,它會溢出緩衝區並覆蓋一些不相關的內存。

  • 如果多個線程共享clientList(或任何其他共享資源),請確保您有適當的互斥機制。

+0

如果'w'爲NULL'worker-> waitForClientResponse()'本身將失敗 – cppcoder

+1

@cppcoder:如果w爲NULL,則'worker-> waitForClientResponse()'調用未定義的行爲。對於空指針上的非虛擬成員函數調用,在嘗試訪問不存在的對象的成員變量之前,似乎很常見。 (例如:https://ideone.com/4jr2ur) – Bill

+0

@Bill查看我的最新更新。 – cppcoder