我正在嘗試在 c 中創建一個多執行緒庫。這是整個專案的鏈接(因為在此處粘貼代碼會太多文本)。
在檔案中tests/MultithreadingTests.c,我正在測驗lib/systems/multithreading/src/ThreadPool.c. 該函式add_work將任何例程函式添加到利用 和 的功能的作業佇列lib/sds/lists/src/Queue.c中lib/sds/lists/src/LinkedList.c。在MultithreadingTests.c中,NUM_TESTS定義我要添加到作業佇列中的作業數,由NUM_THREADS
我在代碼中遇到了一個奇怪的問題。如果NUM_TESTS任何數字小于349,261,則代碼可以正常作業,但任何大于或等于的數字都會349,261導致分段錯誤。我試圖檢查分段錯誤到底發生在哪里,發現它發生在第lib/sds/lists/src/Node.c29 行memcpy(node->data, data, size);
錯誤的代碼流是
tests/MultiThreadingTests.c第 95 行pool->add_work(pool, new_thread_job(routine, &arguments[i]));lib/systems/multithreading/src/ThreadPool.c第 150 行thread_pool->work.push(&thread_pool->work, &job, sizeof(job));lib/sds/lists/src/Queue.c第 54 行return q->list.insert(&q->list, q->list.length, data, size);lib/sds/lists/src/LinkedLists.c第 107 行Node *node_to_insert = new_node(data, size);lib/sds/lists/src/Node.c第 29 行memcpy(node->data, data, size);
我不知道為什么這個問題只有在作業數量高于或等于 349,261 時才會發生,但在它更小時不會發生。
uj5u.com熱心網友回復:
在功能new_thread_pool()上,你既不
thread_pool.pool = malloc(sizeof(pthread_t) * num_threads);在nor中測驗分配失敗- 測驗執行緒創建失敗
pthread_create(&thread_pool.pool[i], NULL, generic_thread_function, &thread_pool);
嘗試在任何系統上創建 349261 或更多執行緒看起來更像是壓力測驗,而不是現實生活中的目的。測驗錯誤并以可用的方式報告它們。
new_node也不檢查分配失敗。除非您為此檢測您的代碼,否則您應該在呼叫周圍使用包裝器malloc()來檢測分配失敗并使用錯誤訊息中止程式。
您的代碼中的問題在于函式mt_test_add_work():您定義了一個具有自動存盤的引數陣列:
Arguments arguments[NUM_TESTS];
該物件在堆疊上分配,使用 8382264 位元組的堆疊空間。這對您的系統來說太多了,并且會導致呼叫鏈中未定義的行為,進一步的堆疊使用實際上會導致分段錯誤:堆疊溢位的典型案例。
您應該在退出函式之前從堆中分配這個物件并釋放它:
Arguments *arguments = malloc(sizeof(*arguments) * NUM_TESTS);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442909.html
