#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
// A的实现,一般会隐藏
typedef void (*CallbackPtr)(int);// 函数指针定义
typedef struct dataCB{
int data;
CallbackPtr callback;
}dataCB;
// 创建实例
dataCB dataCBInstance = {0, NULL};
void* callback_thread(void* arg) { // 此处用的是一个线程
// 循环改变p->a的值为 0 1 2 3 4 5 6 7 8 9,每个3s改变一次
dataCB* p = (dataCB*)arg;
while (1) {
sleep(3);// 延时3s执行callback函数
p->callback(p->data);// 函数指针执行函数,这个函数来自于应用层B
p->data = (p->data + 1) % 10;
}
}
void startup_app_A() {
// 创建线程
pthread_t tid;
pthread_create(&tid, NULL, callback_thread, (void*)&dataCBInstance);
}
// 给B的接口,接收注册函数
extern void SetCallBackFun(CallbackPtr cb) {
printf("SetCallBackFun print! \n");
dataCBInstance.callback = cb;
}
// //-----------------------应用者B-------------------------------
void recieve(int data) // 应用者增加的函数,此函数会在A中被执行
{
//do something
printf("B得到A的数据 = %d\n",data);
}
int main(void) {
// 启动A
startup_app_A();
SetCallBackFun(recieve);
// 主函数
while (1) {
// std::cout << "main function" << std::endl;
printf("main function\n");
sleep(2);
}
return 0;
}
#include <iostream>
#include <functional>
#include <thread>
#include <unistd.h>
using namespace std;
// A的实现,一般会隐藏
using CallbackPtr = std::function<void(int)>;
typedef struct dataCB{
int data;
CallbackPtr callback;
}dataCB;
// 创建实例
dataCB dataCBInstance = {0, NULL};
void* callback_thread(void* arg) { // 此处用的是一个线程
// 循环改变p->a的值为 0 1 2 3 4 5 6 7 8 9,每个3s改变一次
dataCB* p = (dataCB*)arg;
while (1) {
sleep(3);// 延时3s执行callback函数
p->callback(p->data);// 函数指针执行函数,这个函数来自于应用层B
p->data = (p->data + 1) % 10;
}
}
void startup_app_A() {
// 创建线程
std::thread(callback_thread, (void*)&dataCBInstance).detach(); // .detach()分离线程
}
// 给B的接口,接收注册函数
extern void SetCallBackFun(CallbackPtr cb) {
printf("SetCallBackFun print! \n");
dataCBInstance.callback = cb;
}
// //-----------------------应用者B-------------------------------
void recieve(int data) // 应用者增加的函数,此函数会在A中被执行
{
//do something
printf("B得到A的数据 = %d\n",data);
}
int main(void) {
// 启动A
startup_app_A();
SetCallBackFun(recieve);
// 主函数
while (1) {
printf("main function\n");
sleep(2);
}
return 0;
}
实现效果:
PS D:\Work\c++> ./bin/app
SetCallBackFun print!
main function
main function
B得到A的数据 = 0
main function
main function
B得到A的数据 = 1
main function
B得到A的数据 = 2
main function
main function
B得到A的数据 = 3
main function
B得到A的数据 = 4
main function
main function
B得到A的数据 = 5
main function
B得到A的数据 = 6
main function
B得到A的数据 = 7
main function
main function
B得到A的数据 = 8
main function
B得到A的数据 = 9
main function
PS D:\Work\c++> cmake --build build
[100%] Built target app
PS D:\Work\c++> ./bin/app
SetCallBackFun print!
main function
main function
B得到A的数据 = 0
main function
B得到A的数据 = 1
main function
main function
B得到A的数据 = 2
main function
B得到A的数据 = 3
main function
main function
B得到A的数据 = 4
main function
main function
B得到A的数据 = 5
main function
B得到A的数据 = 6
main function
main function
B得到A的数据 = 7
main function
B得到A的数据 = 8
main function
main function
B得到A的数据 = 9
main function
B得到A的数据 = 0
main function
main function
B得到A的数据 = 1
main function
B得到A的数据 = 2
main function
B得到A的数据 = 3
main function
main function
B得到A的数据 = 4
main function
B得到A的数据 = 5
main function
main function
B得到A的数据 = 6
main function
B得到A的数据 = 7
main function
main function
B得到A的数据 = 8
main function
B得到A的数据 = 9
main function
main function
B得到A的数据 = 0
main function
B得到A的数据 = 1
main function
main function
B得到A的数据 = 2
main function
B得到A的数据 = 3
main function
main function
B得到A的数据 = 4
main function
B得到A的数据 = 5
main function
main function
B得到A的数据 = 6
main function
B得到A的数据 = 7
main function
main function
B得到A的数据 = 8
main function
B得到A的数据 = 9
main function
main function
B得到A的数据 = 0
main function
B得到A的数据 = 1
main function
main function
B得到A的数据 = 2
main function
B得到A的数据 = 3
main function
main function
B得到A的数据 = 4
main function
B得到A的数据 = 5
main function
main function
B得到A的数据 = 6
main function
B得到A的数据 = 7
main function
main function
B得到A的数据 = 8
main function
B得到A的数据 = 9
main function
main function
B得到A的数据 = 0
main function
B得到A的数据 = 1
main function
main function
B得到A的数据 = 2
main function
B得到A的数据 = 3
main function
main function
B得到A的数据 = 4
main function
B得到A的数据 = 5
main function
main function
B得到A的数据 = 6
main function
B得到A的数据 = 7
main function
main function
B得到A的数据 = 8
main function
B得到A的数据 = 9
main function
main function
B得到A的数据 = 0
main function
B得到A的数据 = 1
main function
main function
B得到A的数据 = 2
main function
B得到A的数据 = 3
main function
main function
B得到A的数据 = 4
main function
B得到A的数据 = 5
main function
main function
B得到A的数据 = 6
main function
B得到A的数据 = 7
main function
main function
B得到A的数据 = 8
C++版本是我根据别人的文章C语言版本略改了一点,发现没有加.detach(分离线程)不能跑,但是加了有效果,我也不太明白这是不是异步?┭┮﹏┭┮