2009-01-22 90 views
0

我的應用程序在pSOS操作系統上運行。代碼是用Diab C編譯器編譯的。將32位變量的類型更改爲64位變量?

的應用定義了許多計數器已被宣佈爲

unsigned int call_count; 

由於存在的一些這些在一個小的時間幀溢出機率,我已宣佈該計數器作爲

unsigned long long int call_count; 

這我相信至少在我的一生中不會溢出。

我的問題是這種轉換無害嗎?是否有任何我需要關注的開銷。當應用程序處於壓力下時,call_count會不斷增加。性能會受影響嗎? SNMP管理器也會每隔15秒查詢一次這些計數器。

+0

如果你只是使用普通的長期,你可以在接下來的幾十億年每秒1000次而不會溢出。 – 2009-01-22 17:51:56

回答

2

你的代碼是否假定增加一個32位變量是一個原子操作?在32位CPU上增加一個64位變量可能不會成爲原子,除非你想盡辦法做到這一點。

例:

  1. call_count等於0x00000005FFFFFFFF,當有電話打進來
  2. call_count下半部遞增:call_count被設置爲0x000000500000000和CPU的進位被設置爲1
  3. call_count的上半部分增加了進位位:call_count設置爲0x0000000600000000

如果另一個線程或中斷處理程序讀取call_count步驟2和3之間的值,它會得到錯誤的結果(0x000000500000000而不是0x000000600000000)。解決方案是同步訪問call_count。有幾個可能性:

  • 禁止中斷(如適用)
  • 串行訪問使用鎖
  • 讀寫使用原子/互鎖功能(例如:InterlockedIncrement()在Windows上)
1

我懷疑是否存在性能問題,至少如果您使用64位處理器,因爲變量幾乎總是在緩存中。

1

在廣泛的範圍內,變化是無害的。您需要確保訪問該值的任何代碼已準備好處理64位數量,並且任何格式化其值的代碼都需要更改,否則應該足夠安全 - 在沒有任何代碼的情況下有關其他代碼的信息將被更改打破。

0

你應該沒問題。

我假設(來自pSOS)您正在編碼到Moto 68000,它是一個32位處理器;使用64位數字的速度稍慢,因爲它需要更多的指令(​​例如,添加,檢查進位,分支或添加到高位字),但我懷疑你擔心的是四個週期的成本。如果您使用的是64位處理器,那麼64位操作系統與32位操作系統一樣快。

這樣做會增加你的內存存儲開銷,但如果你有很多包含這些計數器的結構,這只是一個問題。