2

2 つの静的 C ライブラリを構築しています。各ライブラリには、mylib_init() を呼び出した後、毎秒 1 回実行する必要があるルーチンがあります。

ITIMER_REAL リソースと SIGALRM シグナルを使用する setitimer を使用して、各ライブラリにこれを実装しました。

void Start1msTimer()
{
    struct itimerval new;
    memset(&new,0, sizeof(new));

    new.it_interval.tv_sec=1;
    new.it_value.tv_sec=1;

    signal (SIGALRM, OneSecTimeout);
    setitimer (ITIMER_REAL, &new,NULL);
}

これまでのところ、すべてがうまく機能していました。

現在、これらのライブラリの両方を使用するサンプル アプリケーションを作成していますが、競合が発生しています。アプリケーションはシグナルごとに 1 つのハンドラーしか持てず、ITIMER_REAL は両方ではなく 1 つのタイマーにしか使用できないことに気付きました。したがって、明らかに物事は現在機能していません。

各ライブラリにタイミングを実装するためのより良い方法は何ですか?

一般に、ライブラリ内にシグナル ハンドラを配置することは悪い考えですか?

4

2 に答える 2

5

はい、ライブラリ内のアプリケーション レベルのリソースを「使い切る」ことは非常に悪い考えです。ライブラリを使用するアプリケーション開発者は、リソースをどのように割り当てるかについて発言権を持たないからです。

そして、あなたが発見したように、複数のライブラリが同じリソースを所有したい場合、相互運用性の問題が発生します。

これを修正する 1 つの方法は、要件を除外しmylib_update()、アプリケーションが 1 秒に 1 回呼び出さなければならない関数とドキュメントを用意することです。そのため、このようなタイマーベースの更新をアプリケーションが属するアプリケーションにどのように実装するかという問題が残ります。

于 2013-05-14T13:03:13.263 に答える
1

You could use threads + a syncronization method. Instead of writing a signal handler, you write a thread. Using a semaphore, you can even run your event thread either on timeout or on demand (ie the app calls a library function that post the semaphore).

于 2013-05-14T13:50:01.253 に答える