2015-04-26 17 views
1

我想了解爲什麼我使用GThreadPool時無法啓動超過4個線程。GThreadPool不是創建超過N個線程

pool = g_thread_pool_new ((GFunc)func, (gpointer)&values, g_get_num_processors(), TRUE, NULL); 
g_thread_pool_push (pool, val, NULL); 
g_thread_pool_push (pool, val, NULL); 
g_thread_pool_push (pool, val, NULL); 
g_thread_pool_push (pool, val, NULL); 
g_thread_pool_push (pool, val, NULL); 

功能g_get_num_processors()給我4作爲結果,我使用它,因爲我希望我的節目同時運行超過4個線程。
我的問題是,我不能執行其他線程後,第一個4已經(並完成)。
爲什麼我會得到這個怪異的behvaiour?
函數func是一個簡單的g_print,因爲我只測試GThreadPool的工作方式。

gpointer func(gpointer data, gpointer user_data) 
{ 
    g_print("hey\n"); 
    g_thread_exit(NULL); 
} 
+0

什麼「不能執行其他線程後的第一個4已經產卵」是什麼意思?你做了什麼,發生了什麼? – nos

+0

這意味着4個線程正確執行並終止後,不能再創建線程。他們被放置在隊列中,他們永遠不會被執行。對 – polslinux

回答

2

由於您在線程池的回調處理程序中調用g_thread_exit(NULL);,所以會出現這種奇怪的行爲。刪除那個電話。

線程池的設計目的並不在於您的代碼退出由線程池管理的線程。

+0

感興趣!只是爲了好奇,我可以問你,你在哪裏讀過它?因爲在官方的GThreadPool文檔中我沒有找到任何東西。但是,非常感謝:) – polslinux

+0

它沒有明確記錄,但大多數線程池不是用戶應該直接與線程交互的想法,而GThreadPool的源代碼沒有任何處理手段其中一個線程退出。 – nos

相關問題