C语言多线程编程 死锁解析
1.假设有两个线程
A线程负责输出奇数。B线程负责输出偶数。
2.当A线程进入锁定状态是,主线程突然异常将A线程停止,这时将导致B线程也无法继续执行,处于死锁状态。如下代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t m; void *runodd(void *d)
{
int i=; for(i=;;i+=)
{
pthread_mutex_lock(&m);
printf("奇数:%d\n",i);
usleep();
pthread_mutex_unlock(&m);
}
}
void *runeven(void *d)
{
int i=;
for(i=;;i+=)
{
pthread_mutex_lock(&m);
printf("偶数:%d\n",i);
usleep();
pthread_mutex_unlock(&m);
}
}
main()
{
pthread_t todd,teven;
pthread_mutex_init(&m,);
pthread_create(&todd,,runodd,);
pthread_create(&teven,,runeven,);
sleep();
printf("外部强制停止todd线程\n");
pthread_cancel(todd);
pthread_join(todd,(void**));
pthread_join(teven,(void**));
pthread_mutex_destroy(&m);
}
解决方法:
运用2个函数(其实是2个宏)
pthread_cleanup_push
pthread_cleanup_pop 这个对函数作用类似于atexit函数
注意:这不是函数而是宏。必须成对使用。
void pthread_cleanup_push(
void (*routine)(void *),//回调函数
void *arg //回调函数的参数
);
触发调用routine的条件:
- 执行了exit()。
- 执行了pthread_cancel()
- pthread_cleanup_pop(1);//参数必须是1
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t m;
void handle(void *d)
{
printf("退出后的调用!\n");
pthread_mutex_unlock(&m);
}
void *runodd(void *d)
{
int i=; for(i=;;i+=)
{
pthread_cleanup_push(handle,);
pthread_mutex_lock(&m);
printf("奇数:%d\n",i);
usleep();
pthread_mutex_unlock(&m);
pthread_cleanup_pop();
}
}
void *runeven(void *d)
{
int i=;
for(i=;;i+=)
{
pthread_mutex_lock(&m);
printf("偶数:%d\n",i);
usleep();
pthread_mutex_unlock(&m);
}
}
C语言多线程编程 死锁解析的更多相关文章
- Linux C语言多线程编程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
- Linux多线程编程详细解析----条件变量 pthread_cond_t
Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- C语言多线程编程
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUT ...
- Linux多线程编程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
- C语言多线程编程二
一. 线程通信----事件: 1.一对一模式: #include <stdio.h> #include <stdlib.h> #include <Windows.h> ...
- Linux操作系统下的多线程编程详细解析----条件变量
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法,弥补了互斥锁(Mutex)的不足. 1.初始化条件变量pthread_cond_init #include <pthread.h> ...
- iOS——多线程编程详细解析
基本定义: 程序:由代码生成的可执行应用.(例如QQ.app) 进程:一个正在运行的程序可以看做是一个进程. (例如:正在运行的QQ 就是一个进程),进程拥有独立运行所需要的全部资源. 线程: 程序中 ...
- C语言 之 多线程编程
一.基础知识 计算机的核心是CPU,承担了所有的计算任务. 操作系统是计算机的管理者,负责任务的调度.资源的分配和管理,统领整个计算机硬件. 应用程序则是具有某种功能的程序,程序是运行于操作系统之上的 ...
随机推荐
- BZOJ1085: [SCOI2005]骑士精神
传送门 dfs+A*优化. A*是人工智能算法,属于启发式搜索的一部分.第一次知道这个名词是在写虫食算的时候闵神说这个用A*搞跑的比谁都快..但是当时搜了很多资料想搞清楚这个东西,但是当时还是太拿衣服 ...
- what's the CRSF ??
What's CSRF attack ? CSRF(" Cross-site request forgery!" 跨站请求伪造) 用实例讲原理: 我们假设一个银行网站A,一个 ...
- ES6之模版字符串
ES6之模版字符串 最近在项目中使用了ES6的模版字符串,在这里加以总结. 1.之前我们也可以使用JavaScript输出模版字符串,通常是下面这样的: $("#result"). ...
- JavaScript Ajax之美~
JavaScript Ajax之美~ 曾经有一段时期,因为开发人员对JavaScript的滥用导致其遭受了一段时间的冷门时期,不被大家看好,后来,到了2005年,Google公司的很多技术都是用了aj ...
- 使用css3进行增强
使用css3进行增强 1,为元素创建圆角 border-radius:25px; .about img{ border: 5px solid #bebebe; float: left; margi ...
- centos 查看cpu个数、核数
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...
- 动态规划 求解 Minimum Edit Distance
http://blog.csdn.net/abcjennifer/article/details/7735272 自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit D ...
- java 类的静态变量
主要是记录一个奇葩的现象,java类中的静态变量,不仅可以通过类名称直接调用,而且还可以通过类的实力对象调用,java是不存在静态类的,如果非要用静态的类那就是内部类. 类中的静态变量是存储在JVM方 ...
- Markdown常用用法
很早之前就听过Markdown,一直没用,用过才发现,原来这么好用,迷人,就好比一位知性.大方.成熟.美丽的少妇一样深深吸引着我,特深夜把学习的笔记记录下. 引用 ">"最好 ...
- webform中使用webapi,并且使用autofac
private void AutofacIoCRegister() { HttpConfiguration config = GlobalConfiguration.Configuration; if ...