写GStreamer插件的时候,不要使用全局变量!

在写gstreamer element的时候,不能使用全局变量。因为element可能在一个进程中被创建多个,比如一个pipeline中就可能有多个queue。要把这些变量全部放到该element的class中去,作为成员变量即可。因为一个进程如果使用了多个该element的话,会创建多个GObject,所以,成员变量也会有多份。如果写成全局变量,那就所有的object共享一个了,会出问题。(其实就把GObject看成一个structure好了,多个GObject在内存中就是多个structure,所以,成员变量不会冲突。而全局变量始终只有一份的)。 

之前还写代码研究过动态库中的全局变量的问题。当一个动态库被多个程序加载时,在内存中动态库只有一份,那么,多个程序同时使用的时候,动态库中的全局变量是否会出问题?答案是不会,因为动态库的数据段每个程序(进程)是独立的,代码段可能是共享的。动态库中的全局变量是copy-on-write的机制,一旦有写入的操作,就会创建一份新的copy出来。

你可能感兴趣的:(Stream)