系统是怎么知道全局变量、局部静态变量或者局部静态对象只能被构建一次?

1.例如:在单线程中:因为objx是静态的对象,在数据区会有它的空间,在它上方地址或者下方地址有四个字节的空间标记objx是否被创建。

  • 首先第一次标记为0,表示objx未被创建。

 

  • 当执行创建静态对象的语句时,系统会查询标记值,如果标记值是0,则调动构造函数创建objx,并且把标记值改为1 。

 

  •  当再次执行创建静态对象语句时,查询标记值,此时标记值为1,则就不会再调用构造函数创建objx对象,则系统就保证了静态对象只被创建一次。

2.在多线程中,线程函数funa和funb都在调用GetObject()函数创建objx,当funa在读objx的标记值时,值为0则创建objx,与此同时funb线程也在读objx的标记值,此时值还未改变也是0,则objx可能会被创建两次。而静态对象objx被创建两次带来的问题是,线程funb会把线程funa初始化objx的值覆盖掉。

 因为此标记值是系统维护的,我们无法用互斥量对这个标记值进行保护,但是可以将线程进行加锁,在funa执行的时候给线程加锁,执行完了之后解锁,再去执行线程funb。保证了funa执行完时,objx的标记值被改为1,当funb去执行时,读此标记值为1,就不会二次创建objx静态对象了。

猜你喜欢

转载自blog.csdn.net/weixin_53472334/article/details/131989299