我是靠谱客的博主 执着超短裙,最近开发中收集的这篇文章主要介绍Linux线程同步--死锁,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

死锁

假如我有两个以上的锁,我线程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线程同步--死锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部