Linux程序多线程入门

Linux多线程 Linux多线程 linux多线程,看着一篇就够了!(指入门) 在学习多线程之前,为了让各位先感受多线程的厉害之处,建议先跑一下这个程序。(先保存和关闭重要的文件和程序) // // test.c // thread // // Created by echo on 2020/12/19. // Copyright © 2020 echo. All rights reserved. // #include <stdio.h> #include <stdlib.h> #in 阅读详情

实例1:进程和线程并行输出

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015年12月04日 星期五 17时44分38秒
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>

/*要执行的线程函数*/
void *thread_routine(void *arg)
{

	printf("i am a thread, my thread id is : %ld\n", pthread_self());
	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("thread i  = %d\n", i);
		fflush(stdout);
		sleep(1);
	}
	printf("thread exit\n");
}

int main()
{
	pthread_t tid;

	int ret = 0;
	ret = pthread_create(&tid, NULL, thread_routine, NULL);//创建一个线程
	if(ret != 0){
		printf("pthread_create error\n");
		exit(0);
	}

	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("main i = %d\n", i);
		fflush(stdout);
		sleep(1);
	}

	sleep(2);//等待线程退出,如果线程还在执行,但是进程退出,那么线程也会退出
	printf("parent exit\n");
	exit(0);
}


实例2:在进程中使用等待线程的函数和线程退出函数

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015年12月04日 星期五 17时44分38秒
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>

void *thread_routine(void *arg)
{
	printf("i am a thread, my thread id is : %ld\n", pthread_self());
	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("thread i  = %d\n", i);
		fflush(stdout);
		sleep(1);
	}
	sleep(3);
	printf("child exit\n");

	pthread_exit(NULL);//线程结束函数
}

int main()
{
	pthread_t tid;

	int ret = 0;
	ret = pthread_create(&tid, NULL, thread_routine, NULL);
	if(ret != 0){
		printf("pthread_create error\n");
		exit(0);
	}

	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("main i = %d\n", i);
		fflush(stdout);
		sleep(1);
	}


	pthread_join(tid, NULL);//等待线程退出
	printf("parent exit\n");
	exit(0);
}


实例3:创建多个线程,并向线程传递数据

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015年12月04日 星期五 17时44分38秒
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#include <pthread.h>

typedef struct Threadinfo{
	char name[64];
	int age;
	int numId;
}ThreadInfo;

int nNum, nLoop;

void *thread_routine(void *arg)
{
	int i = 0;
//	pthread_detach(pthread_self());
	ThreadInfo * p = (ThreadInfo *)arg;
	for (i = 0; i < nLoop; ++i){
		printf("thread id is :%ld, i = %d, numid is %d\n", pthread_self(), i, p->numId);
	}
	printf("child exit: %ld\n", pthread_self());
	pthread_exit(arg);
}

int main()
{
	int i = 0;
	pthread_t tidArray[200];
	ThreadInfo tmp[200];

	printf("input the number of thread:");
	scanf("%d", &nNum);
	printf("input the number of nLoop:");
	scanf("%d", &nLoop);

	int ret = 0;
	for (i = 0; i < nNum; ++i){
		memset(&tmp[i], 0, sizeof(ThreadInfo));
		tmp[i].numId= i;
		pthread_create(&tidArray[i], NULL, thread_routine, &tmp[i]);
	}

	for (i = 0; i < nNum; ++i){
		pthread_join(tidArray[i], NULL);
	}
	printf("parent exit\n");
	exit(0);
}


Linux程序开发入门指南:探索编程世界 然后,安装开发所需的基本软件包,包括编译器(如GCC)、调试器(如GDB)和构建工具(如Make)。然后,安装开发所需的基本软件包,包括编译器(如GCC)、调试器(如GDB)和构建工具(如Make)。通过学习本指南,您将了解Linux环境下的编程概念、工具和实践,并获得编写高效、可靠的Linux应用程序所需的技能。通过学习本指南,您将了解Linux环境下的编程概念、工具和实践,并获得编写高效、可靠的Linux应用程序所需的技能。您可以学习如何创建和使用动态链接库,以提高程序的可维护性和可扩展性。 阅读详情

相关推荐

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5790

Linux多线程采集程序,Linux程序多线程入门

实例1:进程和线程并行输出/*************************************************************************> File Name: threadbase.c> Author:> Mail:> Created Time: 2015年12月04日 星期五 17时44分38秒*******************...

weixin_31577599的博客 118

LaTex的下载与安装(2024小白+windows系统)

本文主要介绍了Latex的下载与安装,还包括安装过程中遇到的小问题的解决。

m0_53096519的博客 2万+

多线程启动不同的程序 c linux,Linux C进程与多线程入门—(4)简单多线程程序

一、进程与线程(1)线程是进程的一个实体,是CPU调度和分派的基本单位,,它是比进程更小的能独立运行的基本单位.(2)进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。...

weixin_39531229的博客 178

STM32 HAL库状态机实现按键多事件检测(无阻塞高效处理)

本文详细介绍基于STM32 HAL库的状态机实现按键多事件检测方法,包括单击、双击等高效无阻塞处理。通过定时器中断和GPIO中断优化,结合状态机设计,显著提升系统响应效率和实时性,适用于嵌入式系统开发。

tech5的博客 1016

从ADS到Origin:高效绘制负载牵引Smith圆图的完整指南

本文提供了一份从ADS导出负载牵引数据并在Origin中绘制专业Smith圆图的完整指南。详细介绍了数据导出、导入、关键的数据解释步骤,以及高效处理多组曲线的技巧,帮助射频工程师快速生成用于报告和论文的出版级图表。

tgb3456789的博客 1135

Linux C进程与多线程入门—(4)简单多线程程序

本文出自https://shuwoom.com博客,欢迎访问! 一、进程与线程 (1)线程是进程的一个实体,是CPU调度和分派的基本单位,,它是比进程更小的能独立运行的基本单位. (2)进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多...

阿蕉的个人博客专栏 1522

BBR算法原理与实现深度解析

BBR算法通过重新定义拥塞控制的基本范式,为现代网络应用提供了突破性的解决方案。随着QUIC协议的普及和智能网卡技术的发展,BBR类算法将在边缘计算、云游戏、工业物联网等领域发挥更重要的作用。

程序猿老樊的博客 2415

Linux并行计算多线程入门程序(POSIX线程并行)

Linux并行计算多线程 #include"stdio.h" #include"stdlib.h" #include<pthread.h> #define NUM_THREADS 4 long int thread_count; void * Hello(void * rank); int main(int argc, char *argv[]) { long int thread; pthread_t * thread_handles; thread_count = N

yxx的博客 397

【谷粒商城】分布式事务与下单

=购物车== 构建gulimall-cart,复制静态资源到nginx,修改网关 购物车分为离线购物车和登录购物车 离线购物车重启浏览器了也还有 1、购物车需求 特点:读多写少,放入数据库并不合适 登录状态:登录购物车 放入数据库 mongodb 放入redis(采用) 登录以后,将离线购物车里合并后清空离线购物车 未登录状态:离线购物车 放入localstorage浏览器的技术 cookie WebSQL 放入redis(采用) 浏览器重启后还在 2、购物车VO (1) 数据结构分析

努力充实,远方可期 1万+

Open3d Qt的环境配置

目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。

阁楼 918

Linux设备驱动程序开发入门

cqfz123的专栏 4949

【SpringBoot 3.x 第57节】Spring Boot 3 启动快得不讲武德?揭秘 Spring AOT 编译引擎背后的真相!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1759

程序员Linux学到什么程度,Linux学到什么程度,才可以找到合适的工作?

首先我说一下我的学习路线吧!我是学习java出生的,懂编程的人都知道,一般我们程序员用开发系统,大多数都是在linux系统上开发的,在最开始的时候把我哥给了我一本书,我名字就叫鸟哥的私房菜!这本书非常不错,非常适合刚入门的新手看学习。里面讲的都是基础,非常适合新手,也容易看懂。不过我建议你还是拿一台电脑按照里面的说明一步一个脚印,按照里面教学的方式,全部按照指示操作一遍,这样的话你对里面的指令的话...

weixin_29649815的博客 2227

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【嵌入式】Linux程序调试工具使用教程-GDB\Coredump\多线程调试\ASAN

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。可让被调试的程序在你所指定的调置的断点处停下来当程序被停下来看,可以检查此时你的程序中所发生的事动态的改变你程序的执行环境。

heroybc的博客 1023

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

arm linux udp 自发自收_嵌入式Linux开发学习如何入门、如何深入?

嵌入式Linux的开发和研究是Linux领域研究的一个热点,目前已开发成功的嵌入式系统有一半以上都是Linux。嵌入式Linux开发学习如何入门、如何深入?学习步骤如下: 1、Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安...

weixin_36377635的博客 127

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

多线程程序在内存中的分布

上一篇博客谈到了普通程序在内存中的分布,这篇博客谈谈文艺程序在内存中的分布。 执行环境 首先缕一下概念吧。在linux下,进程(process)和线程(thread)并没有什么区别,都是一种执行环境(context of execution, COE),在linux下统称为task。 每个执行环境都有自己的状态,包括CPU状态,内存映射状态,权限状态(uid,pid)和各种各样的通信状态(打

程序猿 9681

linux gcc java,linux gcc使用初探

以前,都习惯了在Windows上进行应用开发,最近开始学习linux上的应用开发。使用的编译器是gcc。首先,说一下gcc的安装。第一种方式:用RPM安装gcc先拷贝以下RPM到/usr/local/gccgcc-3.2.2-5.i386.rpmbinutils-xxx.rpmcpp-xxx.rpmglibc-devel-xxx.rpmglibc-headers-xxx.rpmglibc-kern...

weixin_39920415的博客 104

完全手册:Linux系统下C程序开发详解

完全手册:Linux系统下C程序开发详解 本文集深入浅出地讲解了Linux下C应用程序开发所需的基本工具、知识和技巧,主要包括:C语言基础、C程序的常用语句、文件I/O编程、字符与字符串处理、网络编程、进程间通信、多线程编程等内容。可以让读者轻松、快速入门Linux下非图形界面应用编程。 详细解读 和小伙伴们一起来吐槽

chengying332 646

linux后台服务程序练习开发

只有不断练习和实践才能让你自己

闪电小子 952

《嵌入式 Linux应用程序开发标准教程(第2版)》——导读

前 言 本书第1版《嵌入式Linux应用程序开发详解》自2006年7月出版以来,受到了广大读者的一致好评,已经多次印刷,累计销量18000册。许多高等院校、职业学校和培训机构也将本书作为嵌入式专业的教材。许多读者提出了宝贵的意见和中肯的建议。 第2版图书在第1版基础上做了以下修订。 增加PPT教学课件:本书第2版增加了PPT教学课件,方便老师教学使...

weixin_34337381的博客 482

从入门到精通:Linux多线程

从入门到精通:Linux多线程

m0_73150338的博客 1412

Linux多线程编程快速入门

Linux多线程编程快速入门 本文主要对Linux下的多线程进行一个入门的介绍,虽然是入门,但是十分详细,希望大家通过本文所述,对Linux多线程编程的概念有一定的了解。具体如下。   1 线程基本知识 进程是资源管理的基本单元,而线程是系统调度的基本单元,线程是操作系统能够进行调度运算的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进...

qq_29823093的博客 154
上一篇: Qt中MainWindow类实例
下一篇: linux程序多线程互斥锁的简单使用
readyao
博客等级 码龄11年 243粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值