Condition VariableとMutexの組み合わせの前因と結果
2620 ワード
条件反発を一つのイメージの生活状況で比喩するつもりだったが、考えてみると科学的で適切な比喩とは思わなかった.
それはやはり開門して話しましょう.
Condition VariableはC/C++でもC#でもJAVA言語でもMutexを組み合わせて使います.
Mutexの一般的な意味では、相互反発変数を維持し、1つまたは複数の動作の原子性を保証することを知っています.
同じように、簡単に言えばMutexがCondition Variableに加わったのも原子性を保証するためだ.
Condition Variable、条件付きの起動メカニズム.最も古典的なのは生産--メッセージ者モデルにすぎない.
しかし、消費者が消費行為を継続するには「製品」が必要であることから、消費者が「製品」を発見すると
消費された?どうすればいいの?
そう、通常は保留中の状態になります.しかし、この状態はいつ終わるのでしょうか.誰が教えてくれたの?
「製品」は消費できますか?そう、この時消費者は「製品が消費できる」という条件を待ってから目が覚める.
この時はCondition Variableを使うことができます.
上コード:#include
//whileこのプロセスは必須ではありませんpthread_cond_waitというプロセスはすでに待機実行可能である.しかし、スレッドが呼び出される場合は複数ありますので、headが必要です!=NULLの場合のみ実行する.そしてpthread_cond_wait()この方法にはpthread_で内在的な実行プロセスもあります.cond_wait()この過程でlockの保有を保証する必要があり、スレッドが待機キューをリフレッシュすると、保持される前にlockが解放される.
別のスレッドがpthread_を呼び出すとcond_Signal()が起動する前にpthread_を呼び出すため、lockを解放する必要があります.cond_Signal()後、消費プロセスはpthread_を再通過する必要があります.cond_wait()この方法はlockを取得し、論理処理コードを実行し、最後に消費プロセスはlockを解放する.
上の文字の解釈は重要な部分で、主にpthread_です.cond_wait()という内在的な実行過程が重要である.
それはやはり開門して話しましょう.
Condition VariableはC/C++でもC#でもJAVA言語でもMutexを組み合わせて使います.
Mutexの一般的な意味では、相互反発変数を維持し、1つまたは複数の動作の原子性を保証することを知っています.
同じように、簡単に言えばMutexがCondition Variableに加わったのも原子性を保証するためだ.
Condition Variable、条件付きの起動メカニズム.最も古典的なのは生産--メッセージ者モデルにすぎない.
しかし、消費者が消費行為を継続するには「製品」が必要であることから、消費者が「製品」を発見すると
消費された?どうすればいいの?
そう、通常は保留中の状態になります.しかし、この状態はいつ終わるのでしょうか.誰が教えてくれたの?
「製品」は消費できますか?そう、この時消費者は「製品が消費できる」という条件を待ってから目が覚める.
この時はCondition Variableを使うことができます.
上コード:#include
#include <stdlib.h>
#include <pthread.h>
struct msg{
struct msg *next;
int num;
};
struct msg *head;
pthread_cond_t has_product;//Condition Variable
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//
void *consumer(void *p)
{
struct msg *mp;
for(;;){
pthread_mutex_lock(&lock);// , lock
while(head == NULL)
pthread_cond_wait(&has_product,&lock);
//whileこのプロセスは必須ではありませんpthread_cond_waitというプロセスはすでに待機実行可能である.しかし、スレッドが呼び出される場合は複数ありますので、headが必要です!=NULLの場合のみ実行する.そしてpthread_cond_wait()この方法にはpthread_で内在的な実行プロセスもあります.cond_wait()この過程でlockの保有を保証する必要があり、スレッドが待機キューをリフレッシュすると、保持される前にlockが解放される.
別のスレッドがpthread_を呼び出すとcond_Signal()が起動する前にpthread_を呼び出すため、lockを解放する必要があります.cond_Signal()後、消費プロセスはpthread_を再通過する必要があります.cond_wait()この方法はlockを取得し、論理処理コードを実行し、最後に消費プロセスはlockを解放する.
mp = head;
head = mp->next;
pthread_mutex_unlock(&lock);// lock
printf("Consumer %d
",mp->num);
free(mp);
sleep(rand()%5);
}
}
void *producer(void *p)
{
struct msg *mp;
for(;;){
mp = malloc(sizeof(struct msg));
mp->num = rand() % 1000+1;
printf("Produce %d
",mp->num);
pthread_mutex_lock(&lock);// lock
mp->next = head;
head = mp;
pthread_mutex_unlock(&lock);// lock
pthread_cond_signal(&has_product);//
sleep(rand()%5);
}
}
int main(int argc,char *argv[])
{
pthread_t pid,cid;
srand(time(NULL));
cid = pthread_create(&cid,NULL,consumer,NULL);
pid = pthread_create(&pid,NULL,producer,NULL);
sleep(5);
pthread_join(pid,NULL);
pthread_join(cid,NULL);
return 0;
}
上の文字の解釈は重要な部分で、主にpthread_です.cond_wait()という内在的な実行過程が重要である.