マルチスレッドを学んでいます。に関して
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#SCHEDULING
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition_var = PTHREAD_COND_INITIALIZER;
void *functionCount1();
void *functionCount2();
int count = 0;
#define COUNT_DONE 10
#define COUNT_HALT1 3
#define COUNT_HALT2 6
main()
{
pthread_t thread1, thread2;
pthread_create( &thread1, NULL, &functionCount1, NULL);
pthread_create( &thread2, NULL, &functionCount2, NULL);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
printf("Final count: %d\n",count);
exit(0);
}
// Write numbers 1-3 and 8-10 as permitted by functionCount2()
void *functionCount1()
{
for(;;)
{
// Lock mutex and then wait for signal to relase mutex
pthread_mutex_lock( &count_mutex );
// Wait while functionCount2() operates on count
// mutex unlocked if condition varialbe in functionCount2() signaled.
pthread_cond_wait( &condition_var, &count_mutex );
count++;
printf("Counter value functionCount1: %d\n",count);
pthread_mutex_unlock( &count_mutex );
if(count >= COUNT_DONE) return(NULL);
}
}
// Write numbers 4-7
void *functionCount2()
{
for(;;)
{
pthread_mutex_lock( &count_mutex );
if( count < COUNT_HALT1 || count > COUNT_HALT2 )
{
// Condition of if statement has been met.
// Signal to free waiting thread by freeing the mutex.
// Note: functionCount1() is now permitted to modify "count".
pthread_cond_signal( &condition_var );
}
else
{
count++;
printf("Counter value functionCount2: %d\n",count);
}
pthread_mutex_unlock( &count_mutex );
if(count >= COUNT_DONE) return(NULL);
}
}
コードの制御の流れを知りたいです。
としてpthread_cond_wait - unlocks the mutex and waits for the condition variable cond to be signaled
フローの制御について私が理解したのは、
1) スレッド 1、2 が作成され、スレッド 1 に制御が渡されます (シングル コア プロセッサ システムを考慮)
2)ルーチンで発生pthread_cond_wait( &condition_var, &count_mutex );
した場合- ロックを解放し、制御を渡して待機状態に移行します。thread1
void *functionCount1()
thread2 void *functionCount1()
3)thread2
変数count
でチェックされ、それが満たされているcount < COUNT_HALT1 || count > COUNT_HALT2
ため、信号thread1
を送って再起動することはインクリメントすることですcount
4)Steps 2 to 3
が繰り返されます1-3
。thread1
5) thread2 が動作中であり、とcount 4-7
の間の切り替えがない場合thread1
thread2
6)count 8-10
再びsteps 2-3
繰り返されます。
私の理解が正しいかどうか知りたいですか?はスリープthread1
状態になり、スリープ状態からthread2
復帰します (つまり、スレッドが切り替えられcount value 1-3 and 8-10
i.e switching between threads happen 5 times
ます)。
編集
この質問をする私の主な関心事は、それが遭遇したときthread1
に状態に行き、それからのみインクリメントによって通知されない限り再び状態にならないかどうかを知ることです。からの信号の場合のみ、さらに進むことができますsleep
pthread_cond_wait( &condition_var, &count_mutex );
active
thread2
count
1-3
thread2