2012-07-19 43 views
2

我想寫一個程序,我必須通過(共享)庫(它的源代碼可用)調用某些函數。庫的C代碼有幾個全局變量,許多函數都會改變這些全局變量的值。我在程序中必須做的事情是,我所做的每個函數調用都可以使用一組新的變量。在C程序中重新初始化庫變量

例如,讓這個函數是庫的一部分:

int x = 1; 

int foo() 
{ 
    int a = 0; 
    //do somethings to 'a' 
    //... 
    x++; 
    return a; 
} 

現在我調用foo()從我的程序每次的x價值得到更新1到2然後3然後4等on ...我嘗試構建一個程序,以便每次調用foo()時,都會看到x = 1.

我很抱歉地說,我對C/linux如何處理這些變量空間的知識不足,所以這個問題可能看起來很模糊。以上只是一個小例子,實際上,有太多的變量實際上不可能手動重置它們的值。

什麼可能是最好的方式來編譯該庫和/或使用它我的程序,以刷新變量?

(在一個側面說明,什麼我也試圖做的是並行爲foo()調用,但由於共享變量的,我不能做到這一點。)

編輯: 一些工作時web開發項目,我曾經將一些代碼封裝在web服務中,然後從主程序中調用這些服務。 C/Linux中是否存在類似的框架?請注意,函數正在返回數據。

+1

你的側面提示,你所要求的並不能解決你真正的問題。 – 2012-07-19 18:48:04

+0

謝謝!有什麼建議麼?我們可以創建類似服務的東西並從我的程序中調用它嗎? – Ali 2012-07-19 18:52:38

回答

3

你已經發現的一個主要的原因是全局變量(或一般的全局狀態)是非常糟糕的主意

由於您有權訪問源代碼,因此我建議投入一些時間來重構源代碼。

可以實現並行調用FOO具有以下策略的能力:

  • 收集了所有的全局變量到一個單一的結構。稱之爲背景
  • 更改作用於全局變量的每個函數以獲取指向上下文的指針,並更改函數以更新上下文中的變量,而不是更新全局變量。
  • 現在每個想要使用庫的線程都可以創建一個新的上下文並將其傳遞到foo及相關函數。

如果對源代碼進行這樣的更改是不可行的,那麼可以通過啓動child processes來使用多個CPU內核。每個子進程都有自己的內存空間。該選項並不像使用多線程那樣高效。

+0

謝謝。庫源代碼中有數十萬行代碼。我甚至無法想象試圖去改變每個變量的用法。 – Ali 2012-07-19 18:54:51

+0

我能想到並行做的唯一的另一種方法是啓動多個子進程。當然,效率不如線程高,但可能是一個解決方案。更新我的答案以包含這種可能性。 – 2012-07-19 19:07:33

+0

這絕對有幫助。還有一件事:每個子進程計算一個值,並且我試圖在wait()之後在父進程中總結所有這些值。但是,由於顯而易見的原因,我無法檢索這些值(或者在孩子執行時將它們存儲在父內存中)。你能提出一些建議嗎? – Ali 2012-07-19 20:21:32

0

我沒有詳細的答案。但是你可以嘗試以下方法之一:

  1. 卸載和裝載庫
  2. 嘗試清除庫的.bss中,並填寫從庫(REF dl_iterate_phdr()調用)值。數據部分。