最近在研究多線程,然后突然想到如果兩個線程同時訪問一個函數的話,要不要加鎖呢,加鎖怎么加,不加又怎樣這樣的問題..然后去網上找了些帖子學習學習......


上面的代碼明顯執行串了!!!!
函數本身只是代碼,代碼是只讀的,無論多少個線程同時調用都無所謂,因為是只讀嘛.但是函數里面總要用到暑假 ,如果數據屬性線程級別(比如函數形參-->局部變量-->存在棧上-->每個線程都有自己的棧),那么同時調用是沒關系的,因為用的都是本線程的數據;但是如果函數用到一些全局數據,比如全局變量,根據堆內存首地址去訪問的堆內存(形參傳入的),同時操作一個數據結構(如對一個鏈表有什么操作),靜態局部變量,那就不行了,必須要加鎖!!
http://blog.csdn.net/mq_ydn3102/article/details/8546722
1.線程中函數的調用
2.同一個進程中的兩個線程調用同一個處理函數
3.兩個不同的進程中的兩個線程調用同一個處理函數
1.線程中函數的調用:
每個進程都會有自己的虛擬地址空間,同一個進程中的每一個線程都會在這個虛擬空間中,並被分配相應的資源.
線程中的函數實體實在內存中,而函數中的局部變量則會一次被push到棧中.
如果是A函數調用B函數,則會先將A函數的參數和局部變量push到棧中,再將B函數的參數和局部變量push到棧中
具體如下(參數是從右往左壓入棧中,__stdcall和__cdecl調用都是這么處理的):
如果執行上面的函數在棧中會這樣變化
1:將fun函數的傳入參數從右到左依次壓入到棧中。
2:將fun函數的指針壓入棧中
3:將ebp,ebx等寄存器入棧保存
4:在棧中依次為各個變量分配空間
執行后的處理:
1.釋放變量空間
2.彈出寄存器
3.ret,彈出eip,返回主調方代碼
4.釋放參數空間
2.兩個線程調用同一個函數
兩個線程中的函數的局部變量由於是保存在不同的線程中,因此不需要進行互斥處理(除非有非棧內存在搗亂,這種情況必須要有互斥鎖)
3.兩個不同進程中的兩個線程調用同一個處理函數
