#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回调函数的使用的更多相关文章

  1. C语言的本质(17)——回调函数

    如果函数的参数是一个函数指针,我们可以通过这个函数指针传递一个函数的地址给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数(Callback Function).回调函数不是由 ...

  2. C++中类成员函数作为回调函数

    注:与tr1::function对象结合使用,能获得更好的效果,详情见http://blog.csdn.net/this_capslock/article/details/38564719 回调函数是 ...

  3. c语言 ,回调函数[个人理解]

    回调函数:把需要调用的方法的指针pCallBackFuncX作为参数传递给一个函数UsrFunction,以便该UsrFunction函数在处理相似事件的时候可以灵活的使用不同的方法.   以在fla ...

  4. js回调函数2

    使用sublime结合node.js来写js代码特别爽,具体网上有教程.详见:http://blog.csdn.net/dududu01/article/details/42804367 ,其中最主要 ...

  5. callback function(回调函数) - 术语

    回调函数(CallBack Function)的定义: [todo] 下面是callback的一个场景,linux内核.LwIP里也有使用callback funcs.

  6. C++中 线程函数为静态函数 及 类成员函数作为回调函数

    线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...

  7. C 之回调函数

    软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是 ...

  8. RCF的简单使用教程以及什么是回调函数

    RCF的使用教程 RCF(Remote Call Framework)是一个使用C++编写的RPC框架,在底层RCF支持多种传输实现方式(transport implementations). 包括T ...

  9. 深入浅出剖析C语言函数指针与回调函数(一)【转】

    本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn. ...

随机推荐

  1. SVN-如何删除 SVN 文件夹下面的小图标

    第一步:右键新建文本文件. 第二步:打开 并复制一下文件 到 新建文本文件. @echo on    color 2f    mode con: cols=80 lines=25    @REM    ...

  2. SPOJ 8222 NSUBSTR(SAM)

    这几天看了N多论文研究了下后缀自己主动机.刚開始蛋疼的看着极短的代码和clj的论文硬是看不懂,后来结合其它几篇论文研究了下.总算是明确了一些 推荐文章http://blog.sina.com.cn/s ...

  3. C#基础视频教程4.1 如何编写简单的计算器

    要学会基本的窗体控件(button,textbox,label这种,以及他们的重要属性),每个控件的命名要符合规范(例如一般文本框都会重命名txtXXXXX,按钮都会重命名btnXXXXX)   为了 ...

  4. PHP Filter函数

    PHP Filter 函数 PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 Filter 函数是 PHP 核心的组成部分.无需安装即可使用这 ...

  5. tomcat支持中文文件名下载

    http://blog.csdn.net/wnczwl369/article/details/7483806 Tomcat 是Java开发者使用得较多的一个Web服务器,因为它占用资源小,运行速度快等 ...

  6. Cleaner ITweenPath Source

    iTweenPath.cs [pyg language="csharp" s="monokai" ] //Slight additions for a clea ...

  7. ubuntu PATH 出错修复

    我的 ubuntu10.10设置交叉编译环境时,PATH 设置错误了,导致无法正常启动,错误情况如下: { PATH:找不到命令ubuntu2010@ubuntu:~$ ls命令 'ls' 可在 '/ ...

  8. 虚拟机VMware下CentOS6.5安装教程图文详解(VMnet8)

    (写在最前面:如果你下载的iso文件 CentOS-6.*-x86_64-minimal.iso 系列,那么需要这么安装:https://blog.csdn.net/lixianlin/article ...

  9. composer error when run composer update

    本篇文章由:http://xinpure.com/composer-error-when-run-composer-update/ 错误 很多时候即使是常用的命令也会出现一些奇奇怪怪的错误, 难以预知 ...

  10. 在eclipse中将android工程打包生成apk文件

    1.)生成keystore 按照下面的命令行 在C:\Program Files\Java\jdk1.6.0_10\bin>目录下,输入keytool -genkey -alias androi ...