
读共享,写独占
pthread_rwlock_t
pthread_rwlock_init
pthread_rwlock_destroy
pthread_rwlock_rdlock
pthread_rwlock_wrlock
pthread_rwlock_tryrdlock
pthread_rwlock_trywrlock
pthread_rwlock_unlock
示例代码:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h> static int counter;
static pthread_rwlock_t rwlock; void *th_write(void *arg)
{
int t, i;
for (i=; i<; i++) {
pthread_rwlock_wrlock(&rwlock);
t = counter;
usleep();
printf("Write Thread(%x) counter=%d, ++counter=%d\n", (int)pthread_self(), t, ++counter);
pthread_rwlock_unlock(&rwlock);
usleep();
} } void *th_read(void *arg)
{
while() {
pthread_rwlock_rdlock(&rwlock);
printf("Read Thread(%x) counter=%d\n", (int)pthread_self(), counter);
pthread_rwlock_unlock(&rwlock);
usleep();
}
} int main()
{
int i;
pthread_t tid[]; pthread_rwlock_init(&rwlock, NULL);
for (i=; i<; i++)
pthread_create(&tid[i], NULL, th_write, NULL);
for (i=; i<; i++)
pthread_create(&tid[i+], NULL, th_read, NULL);
for (i=; i<; i++)
pthread_join(tid[i], NULL); pthread_rwlock_destroy(&rwlock);
return ;
}
运行结果:
Read Thread(f901e700) counter=0
Read Thread(f981f700) counter=0
Read Thread(f881d700) counter=0
Read Thread(fa020700) counter=0
Read Thread(fa821700) counter=0
Write Thread(fb022700) counter=0, ++counter=1
Write Thread(fb823700) counter=1, ++counter=2
Write Thread(fc024700) counter=2, ++counter=3
Write Thread(fb022700) counter=3, ++counter=4
Write Thread(fb823700) counter=4, ++counter=5
Write Thread(fc024700) counter=5, ++counter=6
Write Thread(fb022700) counter=6, ++counter=7
Write Thread(fb823700) counter=7, ++counter=8
Write Thread(fc024700) counter=8, ++counter=9
Write Thread(fb022700) counter=9, ++counter=10
Write Thread(fb823700) counter=10, ++counter=11
Write Thread(fc024700) counter=11, ++counter=12
Write Thread(fb022700) counter=12, ++counter=13
Write Thread(fb823700) counter=13, ++counter=14
Write Thread(fc024700) counter=14, ++counter=15
Read Thread(f901e700) counter=15
Read Thread(f981f700) counter=15
Read Thread(f881d700) counter=15
Read Thread(fa020700) counter=15
Read Thread(fa821700) counter=15
Read Thread(f901e700) counter=15
Read Thread(f981f700) counter=15
Read Thread(f881d700) counter=15
Read Thread(fa020700) counter=15
...