#include <pthread.h>
int pthread_alloc_stack_cache_np(pthread_attr_t *attr, int nstack);
この関数は
,
スレッド アトリビュートオブジェクトattr
で指定されるスタックをnstack
個確保し,
確保 できたスタックの数を返します. attr
中でスタックプロパティ属性と,
スタックサイズ属性のみが参照されま す.
確保したスタックはスタックキャッシュに蓄えられ,
以降のpthread_create()
によるスレッド の生成 の際に利用されます.
pthread_mutexattr_setprioceiling
pthread_mutexattr_setprioceiling()
はattr
にシーリングを設定します.
PTL
では,
現在のところPTHREAD PRIO PROTECT
プロトコルをサポートしていませんが,
シー リングの設定,
取得だけは可能です.
4.2.2 Mutex の初期化と破棄
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init
pthread_mutex_init()
は, attr
で指定されたMutex
アトリビュートオブジェクトを用い てmutex
で示されるMutex
を初期化します. attr
がNULL
ならば,
デフォルトのMutex
アトリビュートオブジェクト(
第3.2.4
節[Mutex
アトリビュートオブジェクト], 11
ページ.)
が用いられます.
pthread_mutex_init()
が失敗した場合, Mutex
は初期化されず, mutex
の内容は不定にな ります.
pthread_mutex_destroy
pthread_mutex_destroy()
は, mutex
で指定されたMutex
を破棄します.
ロックされたMutex
を破棄したり,
他のスレッドがブロックしているMutex
を破棄した場合の動作は未定義です
.
PTHREAD_MUTEX_INITIALIZER
デフォルトの
Mutex
アトリビュートを使用する場合, PTHREAD MUTEX INITIALIZER
マクロを使用して,
静的に確保したMutex
を初期化することができます.
4.2.3 Mutex のロックとアンロック
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_mutex_lock
pthread_mutex_lock()
によってmutex
で示されるMutex
をロックすることが出来ます(
第3.3.1.3
節[Mutex
のロック], 15
ページ.)
もし, Mutex
が既に他のスレッド によってロッ クされていた場合, pthread_mutex_lock()
を呼び出したスレッド はMutex
が再びロックで きるようになるまでブロックされます.
pthread_mutex_lock
が成功すると, mutex
で示されるMutex
を,
ロックした状態でリター ンします.
呼びだし スレッドが既にロックしている
Mutex
を再びロックしようとした場合, EDEADLK
を返します.
pthread_mutex_trylock
pthread_mutex_trylock()
はmutex
によって示されるMutex
がロックされていた場合に 直ちにEBUSY
を返すことを除いて, pthread_mutex_lock()
と同じです.
pthread_mutex_unlock
pthread_mutex_unlock()
は, mutex
によって示されるMutex
をアンロックするために用 います.
pthread_mutex_unlock()
がMutex
をロックしていないスレッドから呼ばれた場合,
あるい は, Mutex
がロックされていない場合はEPERM
を返します.
Mutex
を待ってブロックしているスレッドが複数存在した場合,
もっとも高いプライオリティのスレッドが
Mutex
をロックします.
4.2.4 Mutex のプライオリティシーリングの変更
PTL
では,
現在PTHREAD PRIO PROTECT
プロトコルをサポートしていませんが,
シーリングの 設定,
取得だけは可能です.
#include <pthread.h>
int pthread_mutex_getprioceiling(pthread_mutex_t mutex, int *prio ceiling);
int pthread_mutex_setprioceiling(pthread_mutex_t mutex, int prio ceiling);
pthread mutex getprioceiling
pthread_mutex_getprioceiling()
はMutex
のシーリングを*prio ceiling
に返します. pthread mutex setprioceiling
pthread_mutex_setprioceiling()
は, Mutex
をロックし, Mutex
のシーリングを変更し, Mutex
を開放します.
もし
, pthread_mutex_setprioceiling()
が失敗した場合, Mutex
のシーリングは変更さ れません.
4.2.5 Mutex に対するネーミング
Mutex
に名前を与えることができます.
名前は,
ユニークで無くても構いません.
ライブラリでは,
スレッ ドが終了する際に, Mutex
がアンロックされていないと, Mutex
の名前を表示して警告を発します.
#include <pthread.h>
int pthread_mutex_setname_np(pthread_mutex_t mutex, const char *name );
int pthread_mutex_getname_np(pthread_mutex_t mutex, char **name);
pthread_mutex_setname_np
pthread_mutex_setname_np()
は, mutex
に名前としてname
を割り当てます. name
は 内部でヒープ領域にコピーされるため, name
の領域はpthread_mutex_setname_np()
の呼 出しの後に開放しても構いません.
pthread_mutex_getname_np
pthread_mutex_getname_np()
は, name
にmutex
の名前へのポ インタを取得し ます. name
は, mutex
が破棄されるまで有効な名前を指しています.
4.2.6 Mutex で Wait 中のスレッド の数
#include <pthread.h>
int pthread_mutex_waiters_np(pthread_mutex_t mutex);
この関数は
, mutex
でブロックしているスレッド の数を返します.
この返り値は, mutex
がロックされて いる時のみ信頼できます.
4.2.7 Condition アト リビュート オブジェクト の操作
#include <pthread.h>
int pthread_condattr_init(pthread_condattr_t *attr );
int pthread_condattr_destroy(pthread_condattr_t *attr );
int pthread_condattr_getpshared(pthread_condattr_t *attr, int *pshared);
int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);
pthread_condattr_init
pthread_condattr_init()
は, Condition
アトリビュートオブジェクトattr
を初期化しま す(
第3.2.5
節[Condition
アトリビュートオブジェクト], 12
ページ.).
pthread_condattr_init()
が失敗した場合, attr
の内容は不定となります.
Condition
アト リビュートオブジェクトを変更,
破棄しても,
それは既に作られたCondition Variable
に影響を与えません.
pthread_condattr_destroy
pthread_condattr_destroy()
は, Condition
アトリビュートオブジェクトを破棄します. pthread_condattr_getpshared
この関数は
, PTL
ではサポートしていません. pthread_condattr_setpshared
この関数は
, PTL
ではサポートしていません.
4.2.8 Condition の初期化と破棄
#include <pthread.h>
int pthread_cond_init(pthread_cond_t *cond,
const pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cond);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_cond_init
pthread_cond_init()
は, attr
で指定されたCondition
アトリビュートオブジェクトを用 いてcond
で示されるCondition Variable
を初期化します.
attr
がNULL
ならば,
デフォルトのCondition
アトリビュート(
第3.2.5
節[Condition
アト リビュートオブジェクト], 12
ページ.)
が用いられます.
pthread_cond_init()
が失敗した場合, Condition Variable
は初期化されず, cond
の内容 は不定になります.
pthread_cond_destroy
pthread_cond_destroy()
は, Condition Variable
を破棄します.
他のスレッドがブロック しているCondition Variable
を破棄した場合の動作は未定義です.
PTHREAD_COND_INITIALIZER
デフォルトの
Condition
アトリビュートを使用する場合, PTHREAD COND INITIALIZER
マクロを使用して,
静的に確保したCondition Variable
を初期化することができます.
4.2.9 Condition のブロード キャスト とシグナル
#include <pthread.h>
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
これらの関数は
, Condition Variable
でブロックしているスレッド をアンブロックします. pthread_cond_signal
pthread_cond_signal()
は,
指定したcond
でブロックしているスレッド を一つアンブロッ クします.
複数のスレッドがCondition Variable
でブロックしていた場合,
もっとも高いプラ イオリティのスレッドがアンブロックされます.
pthread_cond_broadcast
pthread_cond_broadcast()
は,
指定したcond
でブロックしているスレッド を全てアンブ ロックします.
これらの関数によって
, Condition Variable
でのブロックから開放されるスレッド は, pthread_cond_
wait()
やpthread_cond_timedwait()
から リターン する前に,
関連し たMutex
をロックし ます. (
第3.3.2.2
節[Condition Variable
でのWait], 17
ページ.)
pthread_cond_signal()
とpthread_cond_broadcast()
は, cond
でブロックしているスレッドが 存在しなけば何の効果もありません.
4.2.10 Condition での Wait
#include <pthread.h>
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime);
pthread_cond_wait()
とpthread_cond_timedwait()
は, Condition Variable
でブロックするた めに用いられます.
これらは呼びだし スレッド がmutex
をロックした状態で呼び出さなければなりません.
さもなくば 未定義の動作を引き起こし ます.
これらの関数はmutex
をアンロックし,
呼び 出し スレッド をCondition Variable code
でブロックさせます.
これらの関数からリターンした際には, Mutex
は呼び出し スレッド によってロックされた状態となっています.
pthread_cond_timedwait()
は, cond
がシグナルされる前にabstime
によって指定される絶対時刻が 過ぎた場合にエラーでリターンする(Mutex
は再びロックされます)
ことを除いて, pthread_cond_wait()
と同一です.
4.2.11 Condition に対するネーミング
Condition Variable
に名前を与えることができます.
名前は,
ユニークで無くても構いません.
#include <pthread.h>
int pthread_cond_setname_np(pthread_cond_t cond, const char *name);
int pthread_cond_getname_np(pthread_cond_t cond, char **name);
pthread_cond_setname_np
pthread_cond_setname_np()
は, cond
に名前としてname
を割り当てます. name
は内部 でヒープ領域にコピーされるため, name
の領域はpthread_cond_setname_np()
の呼出し の後に開放しても構いません.
pthread_cond_getname_np
pthread_cond_getname_np()
は, name
にcond
の名前へのポインタを取得します. name
は, cond
が破棄されるまで有効な名前を指しています.
#include <pthread.h>
int pthread_cond_waiters_np(pthread_cond_t cond);
この関数は