多執行緒中static物件

2022-07-23 02:21:09 字數 897 閱讀 8889

#include

class

staticinit

static

staticinit

&getinstance

()

void

testfun

()

};

static

staticinit

instance

;

int

main

()

如上面**,對於單個執行緒來說,是安全的。

但是對於多執行緒就不好說了,主要是涉及到static物件初使化的問題。也就是c++中這些static物件和變數是何時初使化的。

先給出結論:

全域性變數和檔案域的靜態變數都將在main開始之前被初始化;只有函式內的區域性靜態變數才是在第一次使用才初始化的,而且不是執行緒安全的。

靜態變數有可能初始化多次

靜態物件初使化的驗證可以用上面的例子來說明,先

g++-

ggdb test

.cpp

然後執行的時候,在第7行**打上斷點,也就是在建構函式裡面打上斷點。看程式在執行到第24和25行的時候有沒有跳到第7行去

執行這個物件的初使化。

推薦閱讀:

1、多執行緒中區域性靜態變數初始化的陷阱

null

多執行緒共享物件

鎖不僅僅是關於同步和互斥,也是關於記憶體可見的,為了保證執行緒能看到共享,變數的最新值,讀取和寫入執行緒都必須使用公共的鎖進行同步 volatile變數 它確保對乙個變數的更新和可預見的方式告訴其他執行緒,被宣告的變數在執行時會被監視,它是共享的,所以讀取乙個volatile型別的變數,會返回某個執...

多執行緒中物件指標須慎用

在多執行緒中環境中,通常需要輔助線程和主線程通訊,一般輔助線程都是使用者執行緒,用createthread,或者afxbeginthread啟動。推薦使用後者 afxbeginthread proc,null 其中proc是函式名,其定義為 uint proc lpvoid lp 通訊方式有兩種,一...

Java多執行緒 鎖物件

前面總結了多個執行緒訪問同乙個物件的同步方法以同步執行,多個執行緒訪問多個物件的同步方法則以非同步方式執行,那如果多個執行緒分別訪問乙個物件中同步方法和非同步方法會如何執行那?demo myobject類 包含了乙個同步方法和乙個非同步方法 public class myobject catch i...