这是我最后一天分享线程的相关知识,冲冲冲O(∩_∩)O
1.线程共享资源的访问
当多个线程同时访问其所共享的线程资源时,需要相互协调,以防止出现数据不一致,不完整的问题,这就叫线程同步.
1).互斥量
int pthread_mutex_init( //初始化互斥锁
pthread_mutex_t *mutex,
//第一个参数也可以为PTHREAD_MUTEX_INITIALIZER
const pthread_mutexattr_t *mutexattr
);
int pthread_mutex_lock( //上锁
pthread_mutex_t *mutex
);
int pthread_mutex_unlock( //解锁
pthread_mutex_t *mutex
);
int pthread_mutex_destroy( //销毁锁
pthread_mutex_t * mutex
);
#include <stdio.h>
#include <pthread.h>
#include <assert.h>
int sum = 0;
pthread_mutex_t lock;
void *run(void *arg){
int i;
for(i=0;i<1000000000;i++){
// pthread_mutex_lock(&lock);
sum++;
// pthread_mutex_unlock(&lock);
printf("sum:%d\n",sum);
}
return NULL;
}
int main(){
pthread_t id[2];
pthread_mutex_init(&lock,NULL);
int i;
for(i=0;i<sizeof(id)/sizeof(id[0]);i++){
int ret = pthread_create(&id[i],NULL,run,NULL);
assert(ret == 0);
}
for(i=0;i<sizeof(id)/sizeof(id[0]);i++){
int ret = pthread_join(id[i],NULL);
assert(ret == 0);
}
pthread_mutex_destroy(&lock);
return 0;
}
大家可以把锁加上 看看效果
2.信号量
信号量是一个计数器,用于控制访问有限共享资源的线程数.
int sem_init(
sem_t * sem,//信号量id
int pshared,//一般取0,表示调用进程的信号量,非0表示该信号量可以为多个进程共享
unsigned int value//信号量初始值
);
int sem_wait(sem_t *sem);//信号量减1,不够减即阻塞
int sem_trywait(sem_t *sem);//信号量减1,不够减即返回-1
int sem_timedwait(//信号量减1,不够减即阻塞,等待超时返回-1,
sem_t *sem,
const struct timespec *abs_timeout //等待的时间
);
struct timespec{
time_t tv_sec;
long tv_nsec;
};
int sem_post(sem_t *sem);//信号量加1
int sem_destroy(sem_t *sem);//销毁信号量
信号量的用法跟锁类似,只不过把上锁的过程变为信号量-1的函数,为了保证不产生资源的不一致的问题,常常把初始信号量置为1