c++并发编程-01-并发与并行_发如雪-ty的博客-CSDN博客
c++并发编程02-什么是I/O_发如雪-ty的博客-CSDN博客
c++并发编程03-I/O多路复用_发如雪-ty的博客-CSDN博客
c++并发编程04-同步与异步_发如雪-ty的博客-CSDN博客_c++同步和异步
c++并发编程05-什么是回调函数_发如雪-ty的博客-CSDN博客_延迟式回调 c++
1.同步调用
A调用B,A需等待B执行完后才能继续往下走。
make_youtiao(10000);
sell();
例1
package com.java.test;
class A {
public void methodA() {
System.out.println("A");
}
}
// B调用A
class B {
public void methodB() {
A a = new A();
a.methodA();
System.out.println("B");
}
}
public class Test0 {
public static void main(String[] args) {
System.out.println("同步调用");
B b = new B();
b.methodB();
}
}
2.异步调用
A调用B,调用后,A可以立即执行接下来的程序,不用等B(A不需要B的结果)。
例1
package com.java.test;
class A1 extends Thread {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A1");
}
}
// B1调用A1
class B1 {
public void methodB1() {
A1 a1 = new A1();
a1.start();
System.out.println("B1");
}
}
public class Test1 {
public static void main(String[] args) {
System.out.println("异步调用");
B1 b1 = new B1();
b1.methodB1(); // 虽然A先执行,但由于等待3s导致先输出B,再输出A
}
}
3.回调
为什么需要回调?最初的例子中,A等B制作好油条后(make_youtiao(10000)要跑10分钟),A再卖出去,即A需要得到B的结果,但是A又不想一直等待10分钟来等到B的结果。于是告诉B在炸好油条后再卖掉就行了(通过回调函数),这样A也不用再关心后续的事情。
① 同步回调
/*
* @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
* @Date: 2021-08-19 11:19:57
* @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
* @LastEditTime: 2023-01-30 17:37:45
* @FilePath: /cpp_test/main.cpp
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <iostream>
#include <unistd.h>
using namespace std;
void sell(int num){
cout << "卖出去" << num << "根油条\n";
}
void real_make_youtiao(int num){
cout << "开始制作" << num << "根油条!\n";
for (int i = 0; i < 10; i++){
sleep(1);
cout << "已经等待" << i + 1 << "分钟\n";
}
cout << "油条制作完毕!\n";
}
void make_youtiao(int num, void(*psell)(int)){
real_make_youtiao(num);
sell(500);
}
int main(){
make_youtiao(10000, sell);
cout << "hello world!\n";
}
② 异步回调
在上面的示例中,虽然我们使用了回调这一概念,但是依然有一个问题就是make_youtiao函数的调用方式依然是同步的。由于我们要制作10000个油条,make_youtiao函数执行完需要10分钟,也就是说即便我们使用了回调,调用方完全不需要关心制作完油条后的后续流程,但是调用方依然会被阻塞10分钟,这就是同步调用的问题所在。反正制作完油条后的后续流程并不是调用方该关心的,也就是说调用方并不关心make_youtiao这一函数的返回值,那么一种更好的方式是:把制作油条的这一任务放到另一个线程(进程)、甚至另一台机器上。