9

Cで書かれたオープンソースのタイマーライブラリを探しています。ライブラリにはタイマーコールバック関数などが必要です。

検索すると、POSIXタイマーまたはsetitimer()が表示されます。これらは、マルチスレッドコードで問題が発生する可能性のあるシグナルベースのアプローチを使用しています。

スレッドコード内でPOSIXタイマーを使用すると、信号が正しい場所に到達しないとします。プロセスで複数のタイマーを使用する場合は、それぞれが異なる信号を使用する必要があります。他に選択肢はありますか?

4

3 に答える 3

11

Linuxを実行しているので、組み込みのPOSIXタイマーAPIを使用することをお勧めします。

int timer_create(clockid_t clockid, struct sigevent *sevp, timer_t *timerid);

これは、コールバック関数のサポートを提供するPOSIXタイマーの使用方法を示すいくつかのドキュメントへのリンクです。

プロセス内の複数のタイマーに関して、ドキュメントには次のように記載されています。

   A program may create multiple interval timers using timer_create().

   Timers are not inherited by the child of a fork(2), and are disarmed and
   deleted during an execve(2).

   The kernel preallocates a "queued real-time signal" for each timer created
   using timer_create().  Consequently, the number of timers is limited by the
   RLIMIT_SIGPENDING resource limit (see setrlimit(2)).

以下に示すように、SIGEV_THREAD_IDを使用して通知を設定することにより、スレッド化されたアプリケーションでPOSIXタイマーを使用できることに注意してください。

The sevp.sigev_notify field can have the following values:

       SIGEV_NONE
              Don't asynchronously notify when the timer expires.  Progress of the
              timer can be monitored using timer_gettime(2).

       SIGEV_SIGNAL
              Upon timer expiration, generate the signal sigev_signo for the process.
              See sigevent(7) for general details.  The si_code field of the
              siginfo_t structure will be set to SI_TIMER.  At any point in time, at
              most one signal is queued to the process for a given timer; see
              timer_getoverrun(2) for more details.

       SIGEV_THREAD
              Upon timer expiration, invoke sigev_notify_function as if it were the
              start function of a new thread.  See sigevent(7) for details.

       SIGEV_THREAD_ID (Linux-specific)
              As for SIGEV_SIGNAL, but the signal is targeted at the thread whose ID
              is given in sigev_notify_thread_id, which must be a thread in the same
              process as the caller.  The sigev_notify_thread_id field specifies a
              kernel thread ID, that is, the value returned by clone(2) or gettid(2).
              This flag is only intended for use by threading libraries.
于 2012-09-17T16:44:38.203 に答える
7

Linuxでそれを行う方法は、epollベースのイベントループとうまく統合するtimerfd_createを使用することです(これにより、シグナルハンドラーの制限を回避します)

于 2012-09-17T20:12:02.867 に答える
-6

これは、のライブラリを作成するのは簡単ではありません。

例:

#include <time.h>
int main()
{
    time_t start,end;
    double dif;
    double duration=40f; //duration of timer
    bool loop=true;
    while(loop==true)
    {
        time(&start);
        if(dif==duration)
        {
            /*callback*/
            dif=0;
        }
        //do stuff
        time(&end);
        dif+=difftime(end,start);
    }
{

于 2012-09-17T16:53:38.837 に答える