创建互斥锁
pthread_mutex_t mutex;
初始化互斥锁
pthread_mutex_init(&mutex); 相当于mutex=1;
在临界区添加互斥锁
pthread_mutex_lock(&mutex); mutex=0
[临界区代码]
pthread_mutex_unlock(&mutex); mutex=1
释放互斥锁资源
pthread_mutex_destroy(&mutex);
必须在所有操作共享资源的线程上都加上锁,否则不能起线程同步的作用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
//定义一把锁
pthread_mutex_t mutex;
void *mythread1(void *args)
{
while(1)
{
//加锁
pthread_mutex_lock(&mutex);
printf("hello ");
sleep(rand()%3);
printf("world\n");
//解锁
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
pthread_exit(NULL);
}
void *mythread2(void *args)
{
while(1)
{
//加锁
pthread_mutex_lock(&mutex);
printf("HELLO ");
sleep(rand()%3);
printf("WORLD\n");
//解锁
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
pthread_exit(NULL);
}
int main()
{
int ret;
pthread_t thread1;
pthread_t thread2;
//随机数种子
srand(time(NULL));
//互斥锁初始化
pthread_mutex_init(&mutex, NULL);
ret = pthread_create(&thread1, NULL, mythread1, NULL);
if(ret!=0)
{
printf("pthread_create error, [%s]\n", strerror(ret));
return -1;
}
ret = pthread_create(&thread2, NULL, mythread2, NULL);
if(ret!=0)
{
printf("pthread_create error, [%s]\n", strerror(ret));
return -1;
}
//等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
//释放互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}
读写锁也叫共享-独占锁,当以读模式锁住时,他是以共享模式锁住的,以写模式锁住时,他是以独占模式锁住的。即读共享,写独占。
读写锁适用于对数据结构读的次数远大于写的情况
读并行,写独占,写的优先级高
定义一把读写锁
pthread_rwlock_t rwlock;
初始化读写锁
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock , const pthread_rwlockattr_t *restrict attr);
函数参数:
* rwlock:读写锁
* attr:读写锁属性,传NULL为默认属性
原文:https://www.cnblogs.com/luyimin/p/14363504.html