##背景
私が現在開発している組込みシステムでは、周期処理に様々な方法が用いられている。中でもtimer_create関数でsigevent構造体のsigev_notifyにSIGEV_THREADを設定し、一定時間が経過したら指定した関数を一つのスレッド(タイマスレッド)として起動する方法はよく使われている手法の一つである。開発中のシステムでは、この方法で周期タイマを実現している箇所が複数存在し、システムを起動させると常にタイマスレッドの生成・終了が行われている。この時、生成されたタイマスレッドがそれぞれどこで生成されたものか気になったので、タイマスレッドのスレッド名を調べてみた。(タイマスレッドの名称とtimer_createを呼び出したスレッド名が一致すると思っていたため。)すると、生成された全てのタイマスレッドが同じスレッド名になっていた。そこで、timer_createでSIGEV_THREADを設定したときの周期タイマの動作について調査してみた。
##timer_createの概要
int timer_create(clockid_t clockid, struct sigevent *restrict evp, timer_t *restrict timerid)
引数:
第一引数:クロックID
第二引数:sigevent情報 →詳細
第三引数:タイマID格納用ポインタ
プロセス毎にタイマを作成する。タイマ満了時sigeventで設定した動作が行われる。
(周期時間の設定やタイマの開始はtimer_settime関数で行う。)
##SIGEV_THREADを設定したときの動作(※自分の環境の場合)
一番最初にSIGEV_THREADが設定されたタイマが作成されたとき、タイマ満了時に起動用のタイマスレッドが生成される。(親スレッドのスレッド名が引き継がれる。)
タイマ満了時、最初に生成されたタイマスレッドで指定した関数を起動する。
→SIGEV_THREADが設定されたタイマが複数作成された場合でも、最初に作成されたタイマスレッドで関数を起動する。そのため、タイマスレッドを生成したスレッド以外は、タイマの作成を行ったスレッドとタイマスレッド名が異なることになる。
但し、既にタイマスレッドが動作しているときに他のタイマが満了した場合、新規にタイマスレッドを生成する。(この時のスレッド名はタイマ満了時に起動するスレッド名と同じ。関数が終わるとタイマスレッドはすぐに終了する。)
##参考文献
この記事は以下の情報を参考にして執筆しました。
timer_create() manual
http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man2/timer_create.2.html
SIGEVENT manual
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/sigevent.7.html