日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

可重入代码

發布時間:2024/4/19 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 可重入代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://hi.baidu.com/benzus/blog/item/6bfe300aca4e9036b0351d7a.html




若一個程序子程序可以安全的被并行執行,則稱其為可重入(reentrant或re-entrant)的;即,當該子程序正在運行時,可以再次進入并執行它。若一個函數是可重入的,則該函數:
  • 不能含有靜態(全局)非常量數據。
  • 不能返回靜態(全局)非常量數據的地址。
  • 只能處理由調用者提供的數據。
  • 不能依賴于單實例模式資源的鎖。
  • 不能調用不可重入的函數。

多'用戶/對象/進程優先級'以及多進程一般會使得對可重入代碼的控制變得復雜。同時,IO代碼通常不是可重入的,因為他們依賴于像磁盤這樣共享的、單獨的資源。

可重入性是函數編程語言的關鍵特性之一。

例子

在以下的C語言代碼中,函數f和函數g都不是可重入的。

int g_var = 1;int f() {g_var = g_var + 2;return g_var; }int g() {return f() + 2; }

以上代碼中,f使用了全局變量g_var,所以,如果兩個線程同時執行它并訪問g_var,則返回的結果取決于執行的時間。因此,f不可重入。而g調用了f,所以它也不可重入。

稍作修改后,兩個函數都是可重入的:

int f(int i) {return i + 2; }int g(int i) {return f(i) + 2; }

與線程安全的關系

可重入與線程安全兩個概念都關系到函數處理資源的方式。但是,他們有一定的區別。可重入概念會影響函數的外部接口,而線程安全只關心函數的實現。

  • 大多數情況下,要將不可重入函數改為可重入的,需要修改函數接口,使得所有的數據都通過函數的調用者提供。
  • 要將非線程安全的函數改為線程安全的,則只需要修改函數的實現部分。一般通過加入同步機制以保護共享的資源,使之不會被幾個進程同時訪問。

因此,相對線程安全來說,可重入性是更基本的特性,它可以保證線程安全:即,所有的可重入函數都是線程安全的,但并非所有的線程安全函數都是可重入的。

總結

以上是生活随笔為你收集整理的可重入代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。