关于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,是不会执行的。所以绝对是线程安全的!!!

此处解释之前错误,有问题大家随时可以和我沟通~欢迎一起探讨!

你可能感兴趣的:(c/c++,gtk,Qt)