關於gdk_threads_add_idle函數的線程安全問題解釋

在《對於gtk多線程編程的一些思考以及實踐歸納系列(1)》

https://blog.csdn.net/FlayHigherGT/article/details/84932747

中提到gdk_threads_add_idle函數的線程安全問題,當時測試情況是錯誤的。我們在主線程中循環將一個全局變量g_num從0++一萬次,之後在副線程中採用gdk_threads_add_idle函數將相同的全局變量g_num--一萬次,之前測試以爲最終結果就是在第二個完成任務的地方輸出g_num得到的結果肯定是0,但是結果確實不是0,所以任務gdk_threads_add_idle不是線程安全的,但是這個函數官方的解釋是在線程中調用,刷新主線程中的界面,其原理是等待主線程空閒的時候纔會執行,那怎麼可能和主線程的任務搶全局變量呢,所以,現在我們來指出之前測試錯誤的地方。

其實很簡單,所謂空閒任務,必須要在gtk_main之後,主線程纔算空閒,gdk_threads_add_idle函數中的內容纔會執行,所以,g_num如果在gtk_main之後打印一遍,那結果必然是0,是毋庸置疑的,所以這裏面就清楚了,在副線程中通過gdk_threads_add_idle起來的任務如果主線程還在操作或者還未進入gtk_main,是不會執行的。所以絕對是線程安全的!!!

此處解釋之前錯誤,有問題大家隨時可以和我溝通~歡迎一起探討!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章