共享独占:
读取锁——共享
写入锁——独占
即:读锁可以加多个;有写锁时,读写锁都加不上;有读锁时,可以加读锁而不能加写锁。
静态分配读写锁:
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
动态分配读写锁:
pthread_rwlock_init(&rwlock,NULL);
pthread_rwlock_destroy(&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);
代码:
#include <stdio.h>
#include <pthread.h>
#include <time.h>
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
int count = 10000;
int put_cur = 0;
void* search(void* arg){
pthread_rwlock_rdlock(&rwlock);
printf("%d leave %d\n",(int)arg,count);
// usleep(500000);
pthread_rwlock_unlock(&rwlock);
}
void rollback(void* arg){
count -= put_cur;
printf("rollback %d to %d\n",put_cur,count);
pthread_rwlock_unlock(&rwlock);
}
void* put(void* arg){
pthread_cleanup_push(rollback,NULL);
pthread_rwlock_wrlock(&rwlock);
put_cur = rand()%1000;
count += put_cur;
printf("%d put %d ok,leave %d\n",(int)arg,put_cur,count);
// usleep(500000);
pthread_rwlock_unlock(&rwlock);
pthread_cleanup_pop(0);
}
void* hacker(void* arg){
sleep(2);
pthread_t* ptids = arg;
pthread_cancel(ptids[0]);
printf("\033[41;34mcancel %lu\033[0m\n",ptids[0]);
}
void* get(void* arg){
pthread_rwlock_wrlock(&rwlock);
int cur = rand()%1000;
if(count>cur){
count -= cur;
printf("%d crash %d leave %d\n",(int)arg,cur,count);
}else{
printf("%d leave not enought %d\n",(int)arg,count);
}
// usleep(500000);
pthread_rwlock_unlock(&rwlock);
}
int main(){
pthread_t tids[100];
typedef void*(*func_t)(void*);
func_t func_arr[3] = {put,search,get};
func_t funcs[100];
pthread_setconcurrency(4);
int i=0;
srand(time(NULL));
for(i=0;i<100;i++){
funcs[i] = func_arr[rand()%3];
}
for(i=0;i<100;i++){
pthread_create(&tids[i],NULL,funcs[i],i);
}
for(i=0;i<100;i++){
pthread_join(tids[i],NULL);
}
}