linux回调函数的使用

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
void *child (void *arg)
{pthread_cleanup_push(pthread_mutex_unlock,&mutex);
 while(1)
 {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(5);
  }
 pthread_cleanup_pop(0);
}
void *child (void *arg)
{
 while(1)
 {sleep(3);//注释1
  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(1);
  }
}
int main()
{int 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,child1,NULL);
 do{
    sleep(2);//此语句(注释2)和注释1的作用是使tid1有时间完成取消动作!
    pthread_cancle(tid1);//没有此语句程序照样可以执行的。
    sleep(2);
    pthread_cond_signal(&cond);
    }while(1);
    sleep(100);
    pthread_exit(0);
}
//没有回调函数 pthread_cleanup_push(pthread_mutex_unlock,&mutex);和pthread_cleanup_pop(0);
//则系统将挂起在在tid2请求锁的地方.
//如把注释1和注释2这两行代码不执行则child2能在child1完成取消动作前得到控制,从而顺利执行
//申请锁的操作,但可能在pthread_cond_wait(&cond,&mutex);中挂起,因为其中也有申请mutex的操作
//(因为在条件满足而离开pthread_cond_wait()前,mutex将重新被加锁,以和进入pthread_cond_wait()前的加锁动作对应!)//child1给出的是标准条件变量的使用方式:回调函数保护,等待条件前解锁, pthread_cond_wait(&cond,&mutex);返回后解锁。
时间: 2024-10-06 00:17:12

linux回调函数的使用的相关文章

深入浅出剖析C语言函数指针与回调函数(二)

上一篇博文的地址: http://blog.csdn.net/morixinguan/article/details/65494239 这节,我们来看看函数指针与回调函数在Linux内核中的应用. 从上节我们了解到,函数指针和回调函数在开发者和用户之间的一个例子,那么这节,我将引用Linux内核中文件操作结构体来详细的说明. 我们首先来看到这个结构体,这段代码位于linux内核的include/linux/fs.h中,由于代码众多,我只截取几个最基本的例子: File_operations文件操

一句话解释回调函数

很多人都听说过“回调函数”这个物件,很多人也都明白,也有一部分像我这样的人不明白.今天吃饭的时候突然明白,说白就是一句话:传一个函数指针 就是一个函数,它的一个参数是一个函数指针. 1 return_value func(func_ptr){ 2 ......... 3 } #include <iostream> using namespace std; int generateOdd(int i){ return 2*i+1; } int print(int(*p)(int i),int K

函数指针和回调函数

函数指针 函数指针是指向函数调用地址的指针.它和函数名究竟有什么关系呢?且看下文. 且看一小程序 首先,先请看下边程序: 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 void func(string s) 6 { 7 cout << s << endl; 8 } 9 10 void (*pFunc)(string s); // 不能够写成 void *pFunc(s

js回调函数2

使用sublime结合node.js来写js代码特别爽,具体网上有教程.详见:http://blog.csdn.net/dududu01/article/details/42804367 ,其中最主要的是在 菜单 Tools --> Build System --> new Build System... 中文版的话是 工具 --> 编译系统 --> 新建编译系统... 下写入一些代码以实现直接用sublime进行代码调试,具体代码如下: { "cmd": [&

函数指针,回调函数的定义和使用

一.函数指针 定义:函数指针是指向函数的指针变量,即本质是一个指针变量. int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋给指针f */ 指向函数的指针包含了函数的地址,可以通过它来调用函数.声明格式如下:  类型说明符 (*函数名)(参数)其实这里不能称为函数名,应该叫做指针的变量名.这个特殊的指针指向一个返回整型值的函数.指针的声明笔削和它指向函数的声明保持一致.指针名和指针运算符外面的括号改变了默认的运算符优先级.如果没有圆括

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

本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn.NET/morixinguan/article/details/52451612 今天我们要搞明白的一个概念叫回调函数. 什么是回调函数? 百度的权威解释如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说

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

注:与tr1::function对象结合使用,能获得更好的效果,详情见http://blog.csdn.net/this_capslock/article/details/38564719 回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从

回调函数 与函数指针

函数指针的定义:返回值类型 ( * 指针变量名) (形参列表); 1:"返回值类型"说明函数的返回类型,"(指针变量名 )"中的括号不能省,括号改变了运算符的优先级.若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的"形参列表"表示指针变量指向的函数所带的参数列表. int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func

UA判断打开页面的环境,然后在callBack写相应环境下的回调函数

(function(){ /* * 使用方法: * 一.引入ua.js * 二.直接调用 MobilePort 对象的属性与方法. * * MobilePort 对象 * 属性:MobilePort.back;// 数组 内容如下 * 方法:MobilePort.androidBrowser(callBack) 安卓浏览器 //callBack 回调只有在安卓浏览器下执行 * 方法:MobilePort.iosBrowser(callBack) ios浏览器 // 下面全部类似 * 方法:Mob