用到的函数:
/*----------------互斥锁-------------*/
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
//初始化锁
//第一个参数:可以理解为锁的ID
//第二个参数:锁的属性
int pthread_mutex_lock(pthread_mutex_t *mutex);
//锁住
//参数:锁的ID
int pthread_mutex_unlock(pthread_mutex_t *mutex);
//解锁
//参数:锁的ID
intpthread_mutex_destroy(pthread_mutex_t*mutex);
//销毁锁
//参数:锁的ID
// 返回:若成功返回0,否则返回错误编号
/*----------------互斥锁-------------*/
/*----------------条件变量-------------*/
#include <pthread.h>
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
//创建条件变量
//第一个参数:条件变量(声明一个同类型的变量,然后取地址填到这里)
//第二个变量:属性,直接填NULL,默认的属性
int pthread_cond_destroy(pthread_cond_t cond);
//销毁条件变量
//参数:条件变量
int pthread_cond_signal(pthread_cond_t cond);
//触发条件变量
//参数:条件变量
int pthread_cond_broadcast(pthread_cond_t cond);
//广播条件变量
//参数:条件变量
/*----------------条件变量-------------*/
使用记录:
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void *fun1(void *arg)
{
int count;
while(1){
pthread_cond_wait(&cond,&mutex);
printf("------the following content is from fun1------\n");
for(count=0;count<8;count++)
{
printf("t1:count = %d\n",count);
sleep(1);
}
}
}
void *fun2(void *arg)
{
int count2 = 0;
printf("-------t2---------\n");
while(1)
{
pthread_mutex_lock(&mutex);
count2++;
printf("t2:count2 = %d\n",count2);
if(count2==5)
{
pthread_cond_signal(&cond);
count2=0;
}
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main()
{
pthread_t t1;
pthread_t t2;
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&mutex,NULL);
pthread_create(&t1,NULL,fun1,NULL);
printf("create fun1 success!\n");
pthread_create(&t2,NULL,fun2,NULL);
printf("create fun2 success!\n");
while(1){
printf("main:cpdd\n");
sleep(1);
}
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);
}
运行结果:
从代码可以看到,上锁的只有一部分,但我也测试过上锁两部分,当两部分代码上同一个锁时,首先抢到锁的就会先运行,而且要等抢到锁的运行完了才能继续重新抢,而不是默认给另一个。
分析下上面的运行结果:fun2上锁的部分会先执行,但可以看到上锁的代码中有一条“pthread_cond_signal”这个是用来触发条件变量的。
当fun2先抢到锁,运行到满足条件以后,就会触发这个条件变量,然后程序就会跳到fun1”pthread_cond_wait“被触发的条件变量这里,然后运行下面的代码,而且相当于这部分被锁了,会先运行完这部分,直到它结束,返回或退出才会再重新开始抢夺锁。
而当fun1先抢到锁,但因为条件变量还没有被触发,所以就会被挂起,什么都不做,然后就开始抢锁,所以fun2总会抢到锁,而fun1只能等fun2先运行到满足条件,再触发条件变量,来使fun1运行。
另外要注意的是:没有参与抢锁的代码(图中“main:cpdd”),是不受锁的操控的,它什么时候穿插进运行的顺序都是说不定的。