反発量の最も簡単な例-スレッド同期_record01


私が理解している反発量は本質的にロックであり、1つのスレッドが共有リソースを使用する前のロックであり、1つのスレッドが共有リソースを使用し、反発量を設定(ロック)、必要なリソースをロックし、(1つ以上のスレッドが動的に割り当てられたオブジェクトを尋ねる必要がある場合)、他のスレッドに触らせず、そのスレッドがこのリソースを使い切った後、反発量(ロック解除)を解放し、このリソースをロック解除して、すべてのスレッドがこのリソースを修正したり使用したりすることができます.
反発量はロックにすぎず、スレッドに作成された特殊なタイプの変数にすぎず、スレッド自体ではなく、スレッド処理の主役でもない.反発量の存在はロックのためである.
次に、本のサンプルコードを示します(データ構造を保護するための反発量がどのように動作するかを説明します).
第1部
1つの構造体を定義し、構造体には3つの変数が定義され、f_のみが定義されています.lockは反発量のタイプ(pthread_mutex_t)であり、他の2つは正常なint変数であり、処理される主役はfooであり、反発量はその属性の1つにすぎないことがわかる.
#include 
#include 

struct foo
{
	int f_count;
	pthread_mutex_t f_lock;
	int f_id;
};

第2部
foo初期化機能を定義する関数は、デフォルトでは、初期化時にスレッド数が1であり、また、1つのスレッドしかないため、他のスレッドの競合リソースが存在しないため、ロックの有無を考慮する必要はありません(したがって、初期化時にはpthread_mutex_lock関数は呼び出されません).
struct foo* foo_alloc(int id)
{
	struct foo* fp;

	if ((fp = malloc(sizeof(struct foo)))!= NULL) {
		fp->f_count = 1;
		fp->f_id = id;
		if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
			free(fp);
		}
	}
	return(fp);
}

第3部
複数のスレッドが存在する場合の現在のスレッドのロック保護操作を定義すると、foo_を実行する限りholdは、ロック関数を実行し、現在のスレッドに対応するリソースをロックしてから、他の操作を行い、処理が完了したら、ロック解除操作を行います.
void foo_hold(struct foo* fp)
{
	pthread_mutex_lock(&fp->f_lock); //  
	fp->f_count++;
	pthread_mutex_unlock(&fp->f_lock); //  
}

第四部分
すべての使用が完了したら、反発量変数を解析的に除去し、使用が完了しなければ操作します.
void foo_rele(struct foo *fp)
{
	pthread_mutex_lock(&fp->f_lock);
	if (--fp->f_count == 0)
	{
		pthread_mutex_unlock(fp->f_lock);
		pthread_mutex_destroy(fp->f_lock);
		free(fp);
	}
	else
	{
		pthread_mutex_unlock(fp->f_lock);
	}
}

全体コード
#include 
#include 

struct foo
{
	int f_count;
	pthread_mutex_t f_lock;
	int f_id;
};

struct foo *foo_alloc(int id)
{
	struct foo *fp;

	if ((fp = malloc(sizeof(struct foo)))!= NULL) {
		fp->f_count = 1;
		fp->f_id = id;
		if (pthread_mutex_init(&fp->f_lock, NULL) != 0) {
			free(fp);
		}
	}
	return(fp);
}

void foo_hold(struct foo *fp)
{
	pthread_mutex_lock(&fp->f_lock);
	fp->f_count++;
	pthread_mutex_unlock(&fp->f_lock);
}

void foo_rele(struct foo* fp)
{
	pthread_mutex_lock(&fp->f_lock);
	if (--fp->f_count == 0)
	{
		pthread_mutex_unlock(fp->f_lock);
		pthread_mutex_destroy(fp->f_lock);
		free(fp);
	}
	else
	{
		pthread_mutex_unlock(fp->f_lock);
	}
}