《Linux多线程服务端编程:使用muduo C++网络库》笔记(1)

Linux 多线程服务器端编程:使用 muduo C++ 网络库 目录 一、线程同步精要 互斥器 mutex 条件变量 封装 MutexLock、MutexLockGuard 和 Condition 线程安全的 Singleton 实现 mutex 与 shared_ptr 的应用实例 一、线程同步精要 并发编程的两种基本模型:message passing 和 shared memory。 线程同步的四项原则: 尽量最低限度的共享对象... 阅读详情
 

以往完全没学过服务端、os等相关知识,甚至于C++语法还有好多没涉及到过,所以在阅读本书过程中遇到了好多全新的知识,一遍阅读理解有限,先记录一下。
相关知识了解过少,下面分类可能不对,主要是记录新遇到的知识点、学过但遗忘的知识点。

C++/C++11

sizeof

首先这不是函数,也不是return一类的操作符关键字,是一个特殊的宏,会在编译期求解

注意是编译期求解所以内部表达式编译后会成为最后值,运行时不会执行内部代码

int a=0;

sizeof(a=1);

cout<<a;//此处是0

两种用法,sizeof(typename/object)?? sizeof object?? 即类型名必须用括号,对象名可不用括号

std::function/std::bind

std::function仿函数,将函数指针封装成了模板类。
std::function<int(int ,int)> ()外为返回值,内为多个参数类型

bind可实现对函数的绑定,支持不同参数类型:C++11 中function和bind以及lambda 表达式的用法

#include <iostream>
using namespace std;
class A {
public:
    void fun_3(int k,int m)     {
        cout<<k<<" "<<m<<endl;
    }
};
 
void fun(int x,int y,int z) {
    cout<<x<<"  "<<y<<"  "<<z<<endl;
}
 
void fun_2(int &a,int &b) {
    a++;
    b++;
    cout<<a<<"  "<<b<<endl;
}
 
int main(int argc, const char * argv[]) {
    auto f1 = std::bind(fun,1,2,3); //表示绑定函数 fun 的第一,二,三个参数值为: 1 2 3
    f1(); //print:1  2  3
 
    auto f2 = std::bind(fun, placeholders::_1,placeholders::_2,3);
    //表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别有调用 f2 的第一,二个参数指定
    f2(1,2);//print:1  2  3
 
    auto f3 = std::bind(fun,placeholders::_2,placeholders::_1,3);
    //表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别有调用 f3 的第二,一个参数指定
    //注意: f2  和  f3 的区别。
    f3(1,2);//print:2  1  3
 
    int n = 2;
    int m = 3;
    auto f4 = std::bind(fun_2, n,placeholders::_1);
    f4(m); //print:3  4
    cout<<m<<endl;//print:4  说明:bind对于不事先绑定的参数,通过std::placeholders传递的参数是通过引用传递的
    cout<<n<<endl;//print:2  说明:bind对于预先绑定的函数参数是通过值传递的

    A a;
    auto f5 = std::bind(&A::fun_3, a,placeholders::_1,placeholders::_2);
    f5(10,20);//print:10 20
    std::function<void(int,int)> fc = std::bind(&A::fun_3, a,std::placeholders::_1,std::placeholders::_2);    在实际使用中都用 <strong>auto<> 关键字来代替std::function… 这一长串了。
    fc(10,20);//print:10 20
    return 0;
}

emplace_back/emplace_front/emplace

emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。在大多数情况下应该优先使用emplace_back来代替push_back。

assert/assert_static

三者差异:运行时、静态

assert_static在编译期间进行判定

所有断言仅用作判断,不要在内部添加可改变全局/局部状态的操作或函数

release编译不会屏蔽assert,除非主动声明NDEBUG宏

std::move/std::forward

下面内容摘自:(原创)C++11改进我们的程序之move和完美转发

IO

阻塞/非阻塞/同步/异步

同步和异步是针对应用程序和内核的交互而言的,对同一个io的多个操作是否有序的,有序同步否则异步

  • 同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪
  • 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知

阻塞和非阻塞从进程/线程角度出发,访问数据时,数据是否就绪与进程/线程是否等待的关系

  • 阻塞方式下读取或者写入函数将一直等待,
  • 非阻塞方式下,读取或者写入函数会立即返回一个状态值

一般来说I/O模型可以分为:同步阻塞,同步非阻塞,IO多路复用,信号驱动,异步IO(只有同步才有阻塞、非阻塞之分)

IO多路复用、信号驱动也是同步的,在IO操作上还是有序的,但表现出一定异步的性质。

同步阻塞,同步非阻塞,IO多路复用,信号驱动,实质都有一定阻塞:内核拷贝数据到进程数据空间。

而异步都是非阻塞的(AIO、IOCP),只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO

select/poll/epoll

https://www.cnblogs.com/zhaodahai/p/6831456.html

select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。

  1. 单个进程可监视的fd数量被限制,即能监听端口的大小有限。
  2. 对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低
  3. 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

  1. 没有最大连接数的限制,原因是它是基于链表来存储的
  2. 大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。
  3. poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,条件触发,ET是“高速”模式,边缘触发。

  1. 在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者 遇到EAGAIN错误。
  2. epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd
  3. 系统中一旦有大量你不需要读写的就绪文件描述符,ET模式比条件触发效率高,系统不会充斥大量你不关心的就绪文件描述符
  4. 没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口)
  5. 效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数
  6. 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递,epoll使用mmap减少复制开销
  7. 在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好
  8.  

边缘触发(Edge Trigger)/条件触发(Level Trigger)

条件触发(Level Trigger)下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作

在边缘触发模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读。

Reactor模式/Proactor模式

事件处理模型,IO设计模式:Reactor和Proactor对比

Reactor(反应器)模式用于同步I/O,而Proactor运用于异步I/O操作

分布式系统

  • 分布式系统险恶之处:时间与事件顺序违反直觉(狭义相对论效应,每个主机均有自己的时钟)
  • 分布式系统软件开发不必纠结于想尽一切办法防止崩溃,应把能随时重启程序作为设计目标
  • 心跳协议确定发送周期、检查周期、timeout。一般前两者一致均为Tc,timeout=2Tc。Tc根据故障延迟敏感性取1s或10s
  • UTC时间闰秒会在12.31或6.30日插入,需要考虑影响
  • 心跳要在工作线程发出,不要另起心跳线程,与业务用同一个连接,不要单独的心跳连接。为了防止伪心跳
  • 以ip:port:start_time:pid作为分布式系统一个进程每次启动/重启的唯一标识符gpid,time为64位整数UTC时间。还可以再加上程序名称和版本号
  • 分布式系统中每一个长期运行的会与其他机器打交道的进程都应该提供一个管理接口,对外提供一个维修探查同道(tcp server),最合适的是使用HTTP提供接口
  • 可扩展的消息格式:不要加协议版本号,应使用扩展字段,确保每个字段终身不变。要用中间语言描述消息格式,JSON、XML、Google Protocol Buffers
  • 分布式系统中单元测试局限性:
  1. 妨碍大型重构,要同时重写源码和测试代码,切换语言测试代码作废
  2. 为方便测试实施依赖注入,破坏代码整体性:可能会为了可测试进行解耦
  3. 稍微复杂一点的测试要用mock,C++中会增加为了测试用的接口及mock类
  4. 某些failure场景难以测试
  5. 对多线程程序无能为力
  • 通过tcp做进程间通讯可通过test harness(mock)所有与被测程序交互的程序来进行测试,此时不会改变被测程序代码,不影响重构,也可进行压力测试,但局限性
  1. 有连接到复杂的程序,如数据库,需要内嵌数据库或建立测试数据库
  2. 如果有其他io,如硬盘操作等,可通过tmpfs测试但与实际有差异
  • DNS用于静态、缓变的解析,用name service替代DNS,解决服务器变动情况,一般以5台服务器提供服务,可以用Paxos算法,有开源实现(ZooKeeper/KeySpace/Doozer)

Techie亮博客,转载请注明:Coologic » 《Linux多线程服务端编程:使用muduo C++网络库》笔记(1)

Coologic 博客域名已更改,已从 www.techieliang.com 改为 www.coologic.cn,上述链接地址受到影响,若需查看源文请手动修改,多有不便,敬请谅解。
Linux多线程服务端编程:使用muduo C++网络库》阅读笔记)(1) 《Linux多线程服务端编程:使用muduo C++网络库》阅读笔记线程安全的的对象生命期管理 线程安全的的对象生命期管理 一、线程安全的的对象生命期管理。 1、什么叫线程安全的类? 一个线程安全的class需要满足:多个线程同时访问的时候,无论操作系统如何调度这些线程,其表现出正确的行为;并且调用端不需要额外的同步或协调动作。 由此可知,标准库中的大多数class都是不是线程安全的,比如string,vector,map。都需要外部加锁才能保证安全。 2、互斥锁的可重入和不可重入是什么意思? 可重入锁又称 阅读详情

相关推荐

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码...

大秦坑王的专栏 3万+

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第二章 线程同步精要

并发编程有两种基本模型,一种是message passing,另一种是shared memory。在分布式系统中,运行在多台机器上的多个进程的并行编程只有一种实用模型:message passing。在单机上,我们也可以照搬message passing作为多个进程的并发模型。这样整个分布式系统的架构的一致性很强,扩容(scale out)起来也较容易。在多线程编程中,message passing更容易保证程序的正确性,有的语音只提供这一种模型。 线程同步的四项原则,按重要性排列: 1.首要原则是尽量最低

tus00000的博客 770

《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市

《Linux 多线程服务端编程:使用 muduo C++ 网络库》 电子版已在京东上市销售。购买地址:http://e.jd.com/30149978.html阅读效果:PCiPad目前京东的阅读器没有切白边功能,值得改进。

陈硕的Blog 3万+

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第六章 muduo网络库简介

2010年3月作者写了一篇《学之者生,用之者死——ACE历史与简评》(http://blog.youkuaiyun.com/Solstice/archive/2010/03/10/5364096.aspx,ACE是(Adaptive Communication Environment)是一个C++编写的开源框架,用于开发高性能、可伸缩、分布式系统的网络应用),其中提到了作者心目中理想的网络库的样子: 1.线程安全,原生支持多核多线程。 2.不考虑可移植性,不跨平台,只支持Linux,不支持Windows。 3.主要支持

tus00000的博客 1134

Linux多线程服务端编程学习(二)如何使用muduo网络库 Centos7

安装、编译muduo,使用muduo 下载、安装编译muduo的过程 点击 https://mp.youkuaiyun.com/mdeditor/90021742# 本文以 陈硕 老师git 网站上 muduo-tutorial-master 程序为例来解释如何运用muduo库,以及其中可能会遇到的问题与解决办法。 1、下载示例程序包 下载地址 https://github.com/chenshuo/mu...

YoungSusie的博客 1618

Linux多线程服务端编程与muduo网络库实践

在多线程服务端编程中,线程是程序执行流的最小单元,允许并发执行。相比之下,进程则是资源分配的最小单位,拥有独立的地址空间。在多核处理器环境下,多线程能有效利用CPU资源,提高程序的并发处理能力。在Linux系统中,I/O模型主要分为以下几种类型:阻塞I/O(Blocking I/O)非阻塞I/O(Non-blocking I/O)I/O复用(I/O Multiplexing)信号驱动式I/O(Signal-driven I/O)

weixin_29301059的博客 684

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第一章 线程安全的对象生命期管理

编写线程安全的类不是难事,用同步原语(synchronization primitives)保护内部状态即可。但对象的生与死不能由对象自身拥有的mutex(互斥器)来保护。如何避免对象析构时可能存在的race condition(竞态条件)是C++多线程编程面临的基本问题,可以借助Boost库的shared_ptr和weak_ptr完美解决,这也是实现线程安全的Observer模式(观察者模式,它是一种行为设计模式,用于定义对象之间的一对多依赖关系,以便当一个对象的状态发生变化时,其所有依赖对象都会得到通知

tus00000的博客 1018

Linux多线程服务端编程-使用muduo C++网络库

作者: 陈硕 《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux下以native语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。书中以muduo网络库为例,讲解这种编程模型的使用方法及注意事项。 《Linux多线程服务端编程:使用muduo C++网络库》的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于公司内网环境的分布式服务系统。

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 附录A 谈一谈网络编程学习经验

本文谈一谈作者在学习网络编程方面的一些个人经验。“网络编程”这个术语的范围很广,本文指用Sockets API开发基于TCP/IP的网络应用程序,具体定义见A.1.5 “网络编程的各种任务角色”。 受限于作者的经历和经验,本附录的适应范围是: 1.x86-64 Linux服务端网络编程,直接或间接使用Sockets API。 2.公司内网。不一定是局域网,但总体位于公司防火墙之内,环境可控。 文本可能不适合: 1.PC客户端网络编程,程序运行在客户的PC上,环境多变且不可控。 2.Windows网络编程。

tus00000的博客 1268

Linux多线程服务端编程:使用muduo C++网络库

《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .

《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]

《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕).[PDF]

《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购

《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购内容简介本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的

陈硕的Blog 6万+

Linux多线程服务端编程,高清无水印!~

Linux多线程服务端编程,高清无水印!~

C++(2)之Linux多线程服务端编程总结

Author: Once Day Date: 2023年1月31日/2024年8月23日一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…漫漫长路,有人对你微笑过嘛…

梅花香自苦寒来,宝剑锋从磨砺出。 2527

别再到处搜了!高德地图瓦片URL参数(lang、style、ltype)全解析与实战搭配指南

本文全面解析高德地图瓦片URL参数(lang、style、ltype)的核心逻辑与实战应用,提供18种实用参数组合方案,帮助开发者实现从基础到高阶的定制化地图渲染。涵盖语言控制、地图样式、图层类型等关键参数,并分享WebGIS项目中的优化技巧与常见问题解决方案。

weixin_33724046的博客 117

避坑指南:OpenWRT改AP模式必做的5个关键设置(DHCP/防火墙/WAN口处理)

本文详细解析了将OpenWRT设备从路由模式切换为AP模式时,必须完成的五个关键设置步骤。核心在于理解AP模式本质是带无线的智能交换机,需彻底关闭DHCP服务、调整防火墙策略、正确桥接所有物理接口(包括WAN口处理),并集成无线网络,以确保设备能透明接入主路由网络,避免出现设备隔离或无法互访等常见问题。

t1u2v的博客 735

《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册

摘要: 《Linux多线程服务端编程:使用muduo C++网络库》这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错的成绩。 以下谈一谈这本书的写作背景与内容取舍的原因。

陈硕的Blog 3万+

阿里云大模型ACP认证模拟考试(一)

摘要:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 4743

muduo网络库与服务模型介绍

muduo是陈硕个人使用C++开发的一款网络库,代码写的很有学习价值,总结的内容来自书籍《Linux 多线程服务器端编程》,也是由陈硕编写,可以配合github代码一起使用。 muduo github网址:https://github.com/chenshuo/muduo 一、muduo网络库简介 1、特点 (1)线程安全,原生支持多核多线程; (2)不跨平台,只支持Linux; (3)只要支持x86-64,兼顾IA32,也可以运行在ARM上; (4)不支持UDP,只支持TCP (5)不支.

yolo_yyh的博客 3506

零中频接收机实战:DC Offset的5种常见解决方案与调试技巧

本文针对零中频接收机中DC Offset这一核心挑战,深入剖析了其产生机理与对信号解调的严重影响。文章从实战角度出发,系统性地介绍了五种解决方案,包括硬件预防、数字域校正、I/Q不平衡联合校正等,并分享了关键的实验室调试与产线测试技巧,旨在帮助射频工程师有效提升接收机性能。

weixin_29234509的博客 399

从 SAP_FLP_USER 到项目落地:把 SAP S/4HANA 中的 SAP Fiori 授权体系真正讲透

SAP Fiori授权体系涉及前端访问、应用入口和后台业务对象三层权限,仅配置基础角色如SAP_FLP_USER无法满足实际业务需求。项目实践中常见用户能看到应用磁贴但无法访问数据的问题,多因授权模型设计不完整所致。SAP建议采用分层授权策略:基础层确保launchpad访问能力,业务层配置具体应用权限。管理员角色SAP_FLP_ADMIN需结合业务权限使用,测试时可临时配置S_SERVICE=*权限,但生产环境应遵循最小权限原则。完整的授权设计需参考SAP Fiori Apps Reference Lib

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 132

Linux C++ 网络库 Muduo

muduo 是一个基于 Reactor 模式的现代 C++ 网络库,它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。视频连接:http://v.youku.com/v_show/id_XNDIyNDc5MDMy.html 下面...

chuchaner7283的博客 1779

【基础-单选】Row组件中有两个Text组件,如果使用justifyContent对齐方式,下面哪个属性可以实现左右两端对齐:

Row组件中有两个Text组件,如果使用justifyContent对齐方式,下面哪个属性可以实现左右两端对齐

江拥羡橙的博客 1304
上一篇: docker的mysql因内存不足自动退出
下一篇: 《Linux多线程服务端编程:使用muduo C++网络库》笔记(2)
coologic
博客等级 码龄7年 35粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值