Condition VariableとMutexの組み合わせの前因と結果


条件反発を一つのイメージの生活状況で比喩するつもりだったが、考えてみると科学的で適切な比喩とは思わなかった.
それはやはり開門して話しましょう.
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()という内在的な実行過程が重要である.