创建于 2020-08-06,完成于 2020-08-07
在之前的课程(四)中我们讲了有关如何套用 socket 实现 bufReader,并在此基础上读取 http 请求和返回值。
今天的任务是 “[易]实现主程序逻辑,监听端口,接收请求”。
所有的代码都在 https://github.com/dashjay/http_demo/tree/5-main-work 中
Let’s do it
0x1 多线程编程
作者对多线程编程了解不是很多,基本上就是在此场景下够用而已。
multi_thread
#include <iostream>
#include <thread>
void thread_sleep(int second) {
std::this_thread::sleep_for(std::chrono::seconds(second));
std::cout << "thread exit" << '\n';
}
int main() {
std::thread thr(thread_sleep, 5);
thr.join();
std::thread thr2(thread_sleep, 999);
thr2.detach();
std::cout << "program exit directly" << '\n';
}
注意几个点:
- thread创建的时候,参数可以直接从第二个参数开始传入
- 创建好的线程可以由两种行为
- join 然后阻塞等待线程结束
- detach 然后立刻回到当前执行语句下方开始执行。
- 什么也不做,当主线程结束时,子线程未执行结束,离开作用域时,会报错
libc++abi.dylib: terminating
并且返回 exit_code: 6
更多的内容我也不知道了,这些知识都是从python库那边迁移过来的,更多请查询百科。
0x2 匿名函数
我说这是和函数你信不?
[]() {
}();
这确实是个函数(无返回值的lambda)可以分为三个部分。
[]
:我经常叫它捕获列表()
: 是参数列表{}
: 函数语句
最后一个括号是执行的意思
// 无参数 无返回值 的lambda表达式
[]() {
std::cout << "hello lambda" << '\n';
}();
int num = 5;
// 有参数 无返回值 的lambda表达式
[](int a) {
std::cout << a << '\n';
}(num);
// 有参数 有返回值 的lambda表达式
auto res = [](int a) -> int {
return ++a;
}(num);
std::cout << "res: " << res << '\n';
// 捕获列表
auto