同じlibの複数のインスタンスを使用する方法

私は単一の無人機(オウムの無人機)を制御するCプログラムを拡張する必要があります。目標は無人飛行隊を制御することですが、APIは大量のグローバル変数(無人機のIP、ポート、無人機の状態など)を使用します。インスタンス間に「衝突」を起こすことなく、ライブラリを何回もインスタンス化できますか?

私が見つけた唯一の解決策は、API(オープンソース)をmain()関数のどこかでfork()を呼び出すように変更することです。これを避けたいのですが...

1
@ JoachimPileborg、これは言うのは簡単です。非常にシンプルなコードで、簡単に行うことができます。
追加された 著者 ugoren,
@ JoachimPileborg、図書館のメンテナーは一つのことです、ユーザーは別のものです。ライブラリを管理している場合は、スレッドセーフにする必要があります。他の誰かのライブラリを使用していて、スレッドセーフではない場合、あなたが知らないコードの大規模な変更は、通常はオプションではありません。
追加された 著者 ugoren,
ライブラリがオープンソースの場合は、代わりにライブラリを変更してグローバル変数を削除してください。
追加された 著者 Some programmer dude,
@ugoren答えが簡単な回避策を持っていれば、その方法があるかもしれませんが、簡単な回避策が不可能な場合は、「適切な」解決法が良いかもしれません。そして、メンテナがパッチを入手すれば、おそらくライブラリの他のユーザにとっては良いでしょう。
追加された 著者 Some programmer dude,

3 答え

サービスプロセスでライブラリをラッピングすることをお勧めします。次に、無人機ごとに1つのサービスプロセスのインスタンスを実行できます。それ以外の場合は、ライブラリを修正してコンテキストパラメータを取得します。

1
追加された

dlmopen can load one library multiple times. But it's limited to 15 times.
You can also create multiple copies of your library and load each of them.

1
追加された
これは実際には本当に醜いもので、良い考えではありません。
追加された 著者 R..,
私は同じ問題に遭遇したときに、この「コピーダイナミックライブラリ」アプローチを使用しました。私の意見ではかなり醜いですが、うまくいきます。
追加された 著者 Alexandre Hamez,

マクロを使用して、次のようなグローバル変数をすべて置き換えます。

#define global1 ctx->global1
#define global2 ctx->global2
...

次に、すべての関数に struct context * ctx 引数を追加します。

あるいは、各グローバル変数に _Thread_local (または古いバージョンのgccで __ thread )を追加し、各インスタンスを独自のスレッドで実行すると、利用可能なグローバル。

0
追加された
ライブラリ自体はすでにmutltithreadされています(スレッド関数はグローバル配列に格納されています...)。もちろん、グローバル変数は複数のファイルで定義され、使用されています。このAPIを変更したくない理由はあまりにも危険で、あまりにも多くの作業が必要です。
追加された 著者 MouleMan,