ええコンサルタント,セキュリティ,ITconsultant,ITコンサルタント

ええコンサルタント > セキュリティ・プラザー > セキュア・システム

コンパイル条件

CPPFLAGS += -D_REENTRANT
CFLAGS += -lpthread

関数の説明

「注」マニュアルページに詳細説明は書かれる。

  1. スレッドの作成
    int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *argv)
    • thread:新規スレッドの識別子
    • attr:新規スレッドの属性
  2. スレッド属性のの操作

    初期化: int pthread_attr_init(pthread_attr_t *attr)
    削除: int pthread_attr_destroy(pthread_attr_t *attr)

    int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
    int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate)
    スレッドを合流させる必要があるかどうかは、この属性により決まる。
    detackstate = PTHREAD_CREATE_JOINABLE , PTHREAD_CREATE_DETACHED

    int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
    int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy)
    スレッドのスケジューリングポリシーを設定する。
    policy = SCHED_OTHER, SCHED_RR, SCHED_FIFO
    SCHED_RRとSCHED_FIFOはスーパーユーザ権限で実行されるプロセスだけを対象に、リアルタイムスケジューリングである。

    int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param)
    int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param)

    int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit)
    int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit)
    inherit = PTHREAD_EXPLICIT_SCHED, PTHREAD_INHERIT_SCHED
    PTHREAD_EXPLIRT_SCHEDはスケジューリングを属性によって、明示的に設定する。PTHREAD_INHERIT_SCHEDは親スレッドから属性を継承する。

  3. スレッドの終了
    pthread_exitを呼び出したスレッドは終了する

    int pthread_exit(void *retval)

    • retval: スレッドの戻り値となるオブジェクトへのポイントであるが、ローカル変数であってはならない。
  4. スレッドからの復帰
    int pthread_join(pthread_t th, void **thread_return)
    
    • th: 終了スレッドの識別子
    • thread_return:終了スレッドの戻り値を指し示すポインタへのポインタ
  5. スレッドの取消

    int pthread_cancel(pthread_t thread)

    int pthread_setcancelstate(int newstate, int *oldstate)
    state = PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE

    int pthread_setcanceltype(int newtype, int *oldtype)
    type = PTHREAD_CANCEL_ASYNCHRONOUS, PTHREAD_CANCEL_DEFERRED

  6. スレッドの実行同期

    ヤマフォによる実行同期

    バイナリヤマフォ:コードのある部分を保護し、任意の時点では一つの実行スレッドだけが該当部分を実行できるようにするためにつかされる。

    計数ヤマフォ:コードのある部分を一定数のスレッドが実行できるようにする

    1. ヤマフォの作成
      #include <semaphore.h>
      int sem_init(sem_t *sem, int pshared, unsigned int value)
      
      • sem:引数valueでヤマフォオブジェクトを初期化し、共有オプションを設定する
      • pshared:0なら生成されたヤマフォは現プロセスのロカール変数で、0ではないならヤマフォは複数のプロセスで共有される。
      • value
    2. ヤマフォのアドミック操作
      int sem_post(sem_t *sem)	一つだけ増
      int sem_wait(sem_t *sem)	一つだけ減
      
    3. ヤマフォの削除
      it sem_destory(sem_t *sem)
      
    mutexによる実行同期

    一つのスレッドだけは、オブジェクトにアクセスできるように、オブジェクトをロックすることができる。

    #include <pthread.h>
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
    int pthread_mutex_lock(pthread_mutex_t *mutex)
    int pthread_mutex_unlock(pthread_mutex_t *mutex)
    int pthread_mutex_destory(pthread_mutex_t *mutex)
    上記関数の戻り値は、全て成功なら0,それ以外ならエラーコードを返す。errnoはセットされないので、戻り値を使って、 エラーの内容を調べるしかない。

参考

筑波大学、電子情報工学系レポート
マルチスレッドプログラミング by Allery Design Office

ええコンサルタント > セキュリティ・プラザー > セキュア・システム