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.