我有一個程式,它使用某種形式的樹、哈希表和串列,并找到兩個檔案之間的相似之處。基本上,它類似于倒排索引。該程式運行良好,但我想使用多執行緒進行并行化。
我面臨的問題是我想要并行化的部分,創建一個串列并在我擁有的樹上進行一些搜索。這會導致不正確的結果。我知道我可以使用互斥鎖并鎖定特定部分,但這會導致時間改進為零。
所以,我的問題是。我可以為特定執行緒分配記憶體嗎?如果我不能,我該如何解決這個問題?
遵循我想要并行化的部分。
List list;
HashTable tokenHash;
initializeList(list);
createHashTable(tokenHash);
char * token = strtok(cur_doc_str, " ");
while( token != NULL ) {
list = searchTokenAtStructs(token, tree, hash);
insertSearchedTokensToHashTable(tokenHash, token);
token = strtok(NULL, " ");
}
編輯:我是執行緒的新手并且迷路了,但最終通過一些除錯我發現問題是strtok. 它不是執行緒安全的。strtok_r似乎可以解決問題。
謝謝大家的答案。他們幫助我更好地理解執行緒。
uj5u.com熱心網友回復:
當然,您可以為特定執行緒分配記憶體。您可以malloc從任何執行緒呼叫。
如果您不需要跨執行緒共享該資料,這就是您需要做的一切。
uj5u.com熱心網友回復:
一種方法是,如果您要分配大量相同型別的物件,則將物件池化。假設你有一個treeNode_t結構。讓每個執行緒都有自己的“空閑”treeNode_t物件鏈表。free(treeNode)您的代碼可以將節點放在呼叫執行緒的空閑串列中,而不是呼叫。而且,在呼叫之前malloc(),您首先要檢查空閑串列,如果有可用的節點,則從那里獲取一個節點。僅malloc()在空閑串列為空時呼叫以獲取節點。
但首先...
你肯定的是,“不正確”的結果你得到的,因為malloc()和free()是不是在你的多執行緒版本的正常作業?如果這確實是問題所在,那么另一種可能性是您使用了錯誤的庫。如果您的構建工具允許您撰寫多執行緒代碼而不給您執行緒安全的malloc()and free(),我會感到非常驚訝,但也許您必須指定一些編譯時或鏈接時選項才能獲得執行緒安全版本圖書館。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406075.html
標籤:
下一篇:將文本檔案讀入C中的矩陣
