概述
死锁
假如我有两个以上的锁,我线程1已经获得锁1,想要获得锁2,而我线程2已经获得锁2,想要获得锁1,现在双方都获取不到自己想要的东西,就会一直等待,这就是死锁。
线程同步
pthread_cond_t创建条件变量
pthread_cond_t cond; // 定义一个条件变量,是一个结构体
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
brief:初始化条件变量(条件变量是利用全局变量进行同步的机制)
param:第一个参数是要初始化的条件变量,第二个参数,NULL
return:成功返回0 ,
pthread_cond_wait等待条件变量
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
brief:没有满足条件变量一直阻塞在这个线程(处于休眠状态),条件变量成立,signal发送信号给wait,wait解除阻塞,并且获取一把lock,执行完wait后面的代码释放unlock
param:第一个参数,条件变量的地址,第二个参数,锁的地址(条件变量必须配合互斥锁使用)
return:成功返回0
pthread_cond_signal唤醒线程
int pthread_cond_signal(pthread_cond_t *cond);
brief:唤醒阻塞的线程
param:条件变量的地址
return:成功返回0
pthread_cond_destroy销毁条件变量
int pthread_cond_destroy(pthread_cond_t *cond);
brief:销毁条件变量
param:需要销毁的条件变量的地址
return:成功返回0
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
pthread_cond_t cond;
pthread_mutex_t mutex;
int data = 0;
void * handler(void *arg)
{
//static int retu = 0;
printf("t1_id:%ldn",(unsigned long)pthread_self());
printf("t1_param:%sn",(char *)arg);
//pthread_exit((void *)&retu);
while(1)
{
pthread_cond_wait(&cond,&mutex);
printf("t1:%dn",data++);
printf("===========t1:quit=======n");
exit(0);
data = 0;
sleep(1);
//pthread_mutex_unlock(&mutex);
}
}
void * handler1(void * arg)
{
printf("t2_id:%ldn",(unsigned long)pthread_self());
printf("t2_param:%sn",(char*)arg);
while(1)
{
pthread_mutex_lock(&mutex);
printf("t2_data:%dn",data);
data++;
if(data == 3)
{
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
}
}
void main()
{
pthread_t t2;
pthread_t t1;
int ret;
char *str1 = "t2: tiis is my pthread!";
char * str = "t1: this is my pthread!";
int * retu;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
ret = pthread_create(&t1,NULL,handler,(void *)str );
if(ret == 0)
{
printf("t1:pthread create succeed!n");
}
ret = pthread_create(&t2,NULL,handler1,(void *)str1);
if(ret == 0)
{
printf("t2:pthread create succeed!n");
}
//pthread_join(t1,(void **)&retu);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
}
我们可以编一个程序来记录我们跑10次
#include <stdio.h>
void main(int argc,char **argv)
{
int time = atoi(argv[1]);
int i;
for(i = 0;i < time;++i)
{
system("./pp");
}
}
编译测试程序后输入./a.out 10 >>test & 10是运行十次的意思 &是后台运行 运行完后,打开test可以看到10次运行效果都写入到文件里了
最后
以上就是执着超短裙为你收集整理的Linux线程同步--死锁的全部内容,希望文章能够帮你解决Linux线程同步--死锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复