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. ...
随机推荐
- 【转】js-ES6学习笔记-Symbol
原文:https://www.cnblogs.com/zczhangcui/p/6435652.html https://blog.mgechev.com/2017/09/16/developing- ...
- [Angular-Scaled web] 4. Using ui-router's named views
In the previous post, we use $stateProvider deriect to root url and using MainCtrl, categories.tmpl. ...
- Python requests 报错解决集锦
python版本号和ssl版本号都会导致 requests在请求https站点时候会出一些错误,最好使用新版本号. 1 Python2.6x use requests 一台老Centos机器上跑着古老 ...
- Visual Studio 2013 Update2
下载: http://download.microsoft.com/download/6/7/8/6783FB22-F77D-45C5-B989-090ED3E49C7C/vs2013.2.iso
- linux apache服务器优化建议整理(很实用)
转载:http://www.cnblogs.com/zhongbin/archive/2013/06/11/3131865.html 1.apache服务器的time_wait过多 fin_wait1 ...
- 定义查询构建器IFeatureLayerDefinition
在宗地出图,需要实现,只显示某一户人的地块.在ArcMap里,有个定义查询,可只显示过滤后的要素. 在代码中,也比较好实现,使用IFeatureLayerDefinition接口即可. IFeatur ...
- .NET破解之爱奇迪(二)
爱奇迪的其他系统软件我不感兴趣,但这个Database2Sharp看起来好像很有用的. 官网介绍: 一个简单点击几次鼠标就能完成一周代码量的代码生成工具,效率惊人.友好体贴,真正的开发好伴侣,提供了对 ...
- Matlab矩阵基本操作(定义,运算)
转自:http://blog.csdn.net/perfumekristy/article/details/8119861 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ...
- Docker随笔:Hyper-V PowerShell Module is not available报错解决方法
当在win10使用docker-machine创建Hyper-v虚拟机时,返回了一个错误”Error with pre-create check: "Hyper-V PowerShell M ...
- python------@staticmethod和@classmethod的作用与区别
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...