![](/img/trans.png)
[英]How to encapsulate C/C++ library code to be runnable in a separate thread with multiple instances?
[英]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.