两个线程访问同一块共享资源,如果不协调顺序,容易造成数据混乱
加锁
mutex
pthread_mutex_init 初始化
pthread_mutex_destroy 摧毁
pthread_mutex_lock 加锁
pthread_mutex_unlock(pthread_mutex_t *mutex) 解锁
互斥量的使用步骤:初始化、加锁、执行逻辑–共享操作数据、解锁
注意事项:加锁需要最小粒度,不要一直占用临界区
尝试加锁
pthread_mutex_trylock(pthread_mutex_t *mutex)
pthread_print.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
pthread_mutex_t mutex=PHTREAD_MUTEX_INITIALIZER;
int sum=0;
void* thr1(void *arg)
{
while(1){
//先上锁
pthread_mutex_lock(&mutex); //加锁当有线程已经加锁的时候会阻塞
printf("hello");
sleep(rand()%3);
printf("world\n");
//释放锁
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
}
void* thr2(void *arg)
{
while(1){
pthread_mutex_lock(&mutex);
printf("HELLO");
sleep(rand()%3);
printf("WORLD\n");
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
}
int main()
{
pthread_t tid[2];
pthread_create(&tid[0],NULL,thr1,NULL);
pthread_create(&tid[1],NULL,thr2,NULL);
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
return 0;
}
mutex_trylock.c
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t mutex;
void* thr(void *arg)
{
while(1){
pthread_mutex_lock(&mutex);
printf("helloworld\n");
sleep(30);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main()
{
pthread_mutex_init(&mutex);
pthread_t tid;
pthread_create(&tid,NULL,thr,NULL);
sleep(1);
while(1){
int ret=pthread_mutex_trylock(&mutex);
if(ret>0){
printf("ret=%d,srrmsg:%s\n",ret,strerror(ret));
}
sleep(1);
}
return 0;
}
死锁:
锁了又锁,自己加了一次锁后又加了一次
交叉锁(每个线程申请锁的顺序要一致,如果申请到一把锁,再申请另外一把时申请失败,应该释放已经掌握的)
互斥量只是建议锁