スレッド同期と反発(スレッドセキュリティ)
4574 ワード
同期:臨界リソースへの合理的なアクセス
反発:臨界リソースが同じ時間に一意にアクセス
反発変数は必ずしもグローバル変数ではなく,複数のスレッドがアクセスできればよい.
反発ロック
リードライトロック
同期を実現する方法:臨界資源アクセスの合理性―生産してから資源がなければ待つことができ、生産資源の後に起動して待つ
じょうけんへんすう
信号量(信号灯)posix標準下
信号量と条件変数の違い:信号量は資源カウント機能を持ち、臨界資源が操作できるかどうかは自身の技術で条件変数が反発ロックと組み合わせて信号量を使用する必要があると判断し、反発を実現することができ、カウントは0/1にすぎない.
設計モード:大物たちはいくつかの経典のよくあるシーンに対して、いくつかの対応する解決策を与えて、単例モード:餓漢モード:プログラムの初期化時にインスタンス化を行って、資源はすでにすべてロードしたため、運行速度は速くて、欠点は初期化時間が長い怠け者モードです:資源が使用する時にロードを行って、対象が使用する時にインスタンス化して、利点は初期化時間が短いことです.しかし、運転がスムーズではありません.
反発:臨界リソースが同じ時間に一意にアクセス
反発変数は必ずしもグローバル変数ではなく,複数のスレッドがアクセスできればよい.
反発ロック
#include
pthread_mutex_t mutex; //
int pthread_mutex_destroy(pthread_mutex_t *mutex);//
int pthread_mutex_init(pthread_mutex_t *restrict mutex,//
const pthread_mutexattr_t *restrict attr);
restrict : , restrict attr
// , , , 0,
int pthread_mutex_lock(pthread_mutex_t *mutex);
// , , 0,
int pthread_mutex_trylock(pthread_mutex_t *mutex);
//
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
:
1.
:
1.
:
1. : pthread_mutex_t mutex;
2. : pthread_mutex_init(&mutex, NULL) : --mutex = 1
3. ,
pthred_mutex_lock(&mutex) : --mutex = 0
4.
pthread_mutex_unlock(&mutex): --mutex = 1
:
lock unlock ,
:
1.
2.
:
1. , ( )
2. , ( )
3. , ( , , , )
4.
:
1.
:
: ,
:
1.
2. , ( , )
3. 1 A
2 B
1 B, B ---- 1 B
2 A, A ---- 2 A
:
---
--- ,
---trylock
リードライトロック
1.
pthread_rwlock_t lock;
2. :
:
:
3.
1. A , , ,
--- ,
2. A , , ,
---
3. A , B , C
---
---
4.
A , B
--- B
A , B
--- B
A , B
--- B
A , B , C
--- B C ( , C B , )
---A , B C
---B , C
A , B , C
---B C
---A , C B
---C , B
5.
:
:
:
:
,
6.
#include
//
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
//
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
//
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
//
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
//
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
//
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
//
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
同期を実現する方法:臨界資源アクセスの合理性―生産してから資源がなければ待つことができ、生産資源の後に起動して待つ
じょうけんへんすう
1. ,
+
:
:
---
2.
:
:
3. : pthread_cond_t;
4. :
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
:
Node *head = NULL;
while(head == NULL)
{
//
// ,
// ,
}
//
: , ,
: , ,
信号量(信号灯)posix標準下
1. --semaphore.h
2.
sem_t sem;
3.
#include
int sem_init(sem_t *sem, int pshared, unsigned int value);
Link with -pthread.
0---
1---
value---
int sem_destroy(sem_t *sem);
int sem_wait(sem_t *sem);
sem --
sem 0,
int sem_trywait(sem_t *sem);
sem==0, , ,
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
int sem_post(sem_t *sem);
sem ++
信号量と条件変数の違い:信号量は資源カウント機能を持ち、臨界資源が操作できるかどうかは自身の技術で条件変数が反発ロックと組み合わせて信号量を使用する必要があると判断し、反発を実現することができ、カウントは0/1にすぎない.
設計モード:大物たちはいくつかの経典のよくあるシーンに対して、いくつかの対応する解決策を与えて、単例モード:餓漢モード:プログラムの初期化時にインスタンス化を行って、資源はすでにすべてロードしたため、運行速度は速くて、欠点は初期化時間が長い怠け者モードです:資源が使用する時にロードを行って、対象が使用する時にインスタンス化して、利点は初期化時間が短いことです.しかし、運転がスムーズではありません.