2006-02-14から1日間の記事一覧
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); int pthread_join(pthread_t th, void **thread_return); どうしてcreateはスレッドのポインターを渡して、joinではスレッドそのものを渡す…
食事をする哲学者の問題(Dining philosophers problem)という、デッドロックの有名な話があります。http://msugai.fc2web.com/java/thread/diningPh.htmlこれをpthreadsで作ってみました。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #define NFORK 5 #define</pthread.h></unistd.h></stdlib.h></stdio.h>…
condition variableを使わない場合を考える。この場合は、watch()自身が定期的にリソースの値を確認し、閾値に達するまでスピンする。一応同じ操作は可能だけど、閾値に達するまでずっとスピンしてるってのもCPUに優しくないし、その間何度もmutexのlockとun…
続いては、condition variable(状態変数)。pthreadの同期機能の一つで、スレッドをイベント待ち状態にしたり、イベント待ち状態のスレッドを起こしたりするキーに使う。「状態変数」と言ってもそれ自体の値を見てどうこうするわけじゃないから注意・・・とい…
mutexを動的に生成したいというような場合は、pthread_mutex_initで初期化。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #define THREADSNUM 5 void func(void); int res=0; pthread_mutex_t *mutex; int main(void){ pthread_t thread[THREADSNUM]; int i; m</pthread.h></unistd.h></stdlib.h></stdio.h>…
・・・という問題があったので、mutexを使って排他制御をする。まずはグローバルに pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;とmutexを宣言して、pthread_mutex_lock()とpthread_mutex_unlock()を追加するだけ。超簡単。 void func(void) { int i…
並列環境ではおなじみの、排他制御に関する問題。共有リソースresの値を1インクリメントする際に、 resの値を取得 resの値を1インクリメント resの値をセット という操作が行われますが、ここで1〜3の操作がアトミックではないため、途中でコンテキストスイ…
続いてはスレッド間で共有したいリソースがあるような場合。マルチプロセスではshmget(), shmat()を使って明示的に共有メモリーを確保する必要があったけど、マルチスレッドではプロセス内でグローバルな(?)変数を定義するだけでOK。 #include <stdio.h> #include <unistd.h> #</unistd.h></stdio.h>…