linux回调函数的使用
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void *child1 (void *arg)
{
pthread_cleanup_push((void *)pthread_mutex_unlock,(void *)&mutex);//注释1
while()
{printf("thread1 get running \n");
printf("thread1 pthread_mutex_lock returns %d\n",pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread1 condition applied\n");
pthread_mutex_unlock(&mutex);
sleep();
}
pthread_cleanup_pop();//注释2
}
void *child2 (void *arg)
{
while()
{sleep();//注释3
printf("thread2 get running \n");
printf("thread2 pthread_mutex_lock returns %d\n",pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
printf("thread2 condition applied\n");
pthread_mutex_unlock(&mutex);
sleep();
}
}
int main()
{pthread_t tid1,tid2;
printf("hello condition variable test\n");
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&tid1,NULL,child1,NULL);
pthread_create(&tid2,NULL,child2,NULL);
do{
sleep();//注释4
pthread_cancel(tid1);//注释5
sleep();//注释6
pthread_cond_signal(&cond);
}while();
sleep();
pthread_exit();
return ;
}
如果不执行注释5的pthread_cancle()动作,那么即使没有sleep()延时操作,child1和child都能正常工作。注释3和
注释4的延迟使child1有时间完成取消动作,使child2能在child1退出后执行请求锁操作。如果没有注释1和注释2的
回调函数的定义,则系统将挂起在child2请求锁的地方;如果不做注释3也不做注释4的延时,则child2能在child1
完成取消动作之前得到控制,从而顺利执行申请锁的操作,但却可能在child_cond_wait()中挂起,因为其中也有申请
mutex的操作。child1函数给出的是标准的条件变量的使用方式:回调函数保护,等待条件前锁定,child_cond_wait()
返回后解锁。条件变量机制不是异步信号安全的,也就是说,在信号处理函数中调用pthread_cond_signal()或
pthread_cond_broadcast()很可能引起死锁!!
程序运行结果为:


可以看出最后一直在执行线程2,因为线程1被取消了! 这就是要加-lpthread的原因!!
linux回调函数的使用的更多相关文章
- C语言的本质(17)——回调函数
如果函数的参数是一个函数指针,我们可以通过这个函数指针传递一个函数的地址给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数(Callback Function).回调函数不是由 ...
- C++中类成员函数作为回调函数
注:与tr1::function对象结合使用,能获得更好的效果,详情见http://blog.csdn.net/this_capslock/article/details/38564719 回调函数是 ...
- c语言 ,回调函数[个人理解]
回调函数:把需要调用的方法的指针pCallBackFuncX作为参数传递给一个函数UsrFunction,以便该UsrFunction函数在处理相似事件的时候可以灵活的使用不同的方法. 以在fla ...
- js回调函数2
使用sublime结合node.js来写js代码特别爽,具体网上有教程.详见:http://blog.csdn.net/dududu01/article/details/42804367 ,其中最主要 ...
- callback function(回调函数) - 术语
回调函数(CallBack Function)的定义: [todo] 下面是callback的一个场景,linux内核.LwIP里也有使用callback funcs.
- C++中 线程函数为静态函数 及 类成员函数作为回调函数
线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...
- C 之回调函数
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是 ...
- RCF的简单使用教程以及什么是回调函数
RCF的使用教程 RCF(Remote Call Framework)是一个使用C++编写的RPC框架,在底层RCF支持多种传输实现方式(transport implementations). 包括T ...
- 深入浅出剖析C语言函数指针与回调函数(一)【转】
本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn. ...
随机推荐
- React同构直出优化总结
收录待用,修改转载已取得腾讯云授权 作者:郭林烁 joeyguo 原文地址 React 的实践从去年在 PC QQ家校群开始,由于 PC 上的网络及环境都相当好,所以在使用时可谓一帆风顺,偶尔遇到点小 ...
- c语言打印uint64, int64
http://stackoverflow.com/questions/9225567/how-to-print-a-int64-t-type-in-c
- 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效
一次编译程序时.出现故障 >------ 已启动生成: 项目: PhotoStore, 配置: Debug Win32 ------ 1>生成启动时间为 2013-01-15 18:10: ...
- 求证:a^4+b^4 ≧a^3*b+a*b^3
证明: a4+b4-a3b-ab3 =a3(a-b)-b3(a-b) =(a3-b3)(a-b) =(a-b)2(a2+ab+b2) 而a2+ab+b2=a2+ab+b2/4+3b2/4=(a+b/2 ...
- aes加密在linux下会生成随机key的解决办法
直接贴代码了: package com.segerp.tygl.weixin.common; import java.io.UnsupportedEncodingException; import j ...
- 稍复杂的ionic例子:显示一个列表,并且允许点击进入列表项
这个例子,按照MVC的方式进行了分层,下面是代码: demo3.htm <!DOCTYPE html> <html ng-app="app"> <he ...
- 很全的Python 面试题 github
https://github.com/taizilongxu/interview_python
- ES PS TS 流的区别
http://fengqing888.blog.163.com/blog/static/330114162012111805717584/ ES是原始码流,包含视频.音频或数据的连续码流.TS是传输流 ...
- PHP 杂项函数
PHP 杂项 函数 PHP 杂项函数简介 我们把不属于其他类别的函数归纳到杂项函数类别. 安装 杂项函数是 PHP 核心的组成部分.无需安装即可使用这些函数. Runtime 配置 杂项函数的行为受 ...
- 算法笔记_157:算法提高 c++_ch02_01(Java)
目录 1 问题描述 2 解决方案 1 问题描述 编写一个程序,利用强制类型转换打印元音字母大小写10种形式的ASCII码. 输出的顺序为:大写的字母A,E,I,O,U的ASCII码,小写的字母a, ...