簡體   English   中英

Linux上一個庫的多個實例具有單獨的數據段

[英]Multiple instances of a library on Linux with separate data segments

我的C代碼充滿了全局變量,需要與我的項目鏈接在一起。 這個外部項目是一個經常更新的實時項目,因此要使代碼更加多實例友好,這並不是一個簡單的選擇。 舉一個具體的例子,假設我們有庫代碼(忽略不安全性!):

// foo.c
static char s_memory[256];
static int s_length;

void foo_init(char **mem)
{
    *mem = s_memory;
}

void foo_calc(char *mem)
{
    s_length = strlen(mem);
}

int foo_result()
{
    return s_length;
}

用法如下:

// test_foo.c
char *data;
foo_init(&data);
strcpy(data, "Hello, world!");
foo_calc(data);
printf("%s is %d characters long!\n", data, foo_result());

這對於單線程實例可以很好地工作,但是我們的團隊希望在多線程環境中運行它,這顯然是錯誤的:

char *data1;
char *data2;
foo_init(&data1);
foo_init(&data2);
strcpy(data1, "Hello, world!");
strcpy(data2, "Goodbye cruel world!");
foo_calc(data1);
foo_calc(data2);
printf("%s and %s are %d and %d characters long!\n",
       data1, data2, foo_result(), foo_result());

我希望我們能做的是:

char *data1;
char *data2;
FOO_HANDLE inst1 = new_instance("foo.so");
FOO_HANDLE inst2 = new_instance("foo.so");
inst1.foo_init(&data1);
inst2.foo_init(&data2);
strcpy(data1, "Hello, world!");
strcpy(data2, "Goodbye cruel world!");
inst1.foo_calc(data1);
inst2.foo_calc(data2);
printf("%s and %s are %d and %d characters long!\n",
       data1, data2, inst1.foo_result(), inst2.foo_result());

這樣的事情怎么實現?

最簡單的簡單解決方案是將_Thread_local (或__thread )放在每個全局__thread上,並從其自己的線程訪問每個實例。

另一個可能可行的技巧是每次需要新實例時都創建.so文件的新副本,並使用dlopen 或者,您可以編寫自己的ELF加載程序,該加載程序允許同一個庫的多個實例(聽起來並不那么困難)。

但是,所有這些都是不好的hack,您真的應該只修復代碼以刪除所有全局變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM