写一个程序,打印“你好吗?”和“很好,谢谢!”“三次,分别。延迟一段时间,打印出来后。 1)定义Thread的子类,覆盖Thread的run方法。 2)在main类中创建2个对象(线程)。

该博客介绍了一个Java程序,要分别打印“你好吗?”和“很好,谢谢!”三次,且每次打印有延迟。通过定义Thread子类并覆盖run方法,在main类中创建2个线程对象来实现。

写一个程序,打印“你好吗?”和“很好,谢谢!”“三次,分别。延迟一段时间,打印出来后。

1)定义Thread的子类,覆盖Thread的run方法。
2)在main类中创建2个对象(线程)。

package week15;
/*
 写一个程序,打印“你好吗?”和“很好,谢谢!”“三次,分别。延迟一段时间,打印出来后。
1)定义Thread的子类,覆盖Thread的run方法。
2)在main类中创建2个对象(线程)。
 */
class mythread  extends Thread{
	public mythread(String name) {
		setName(name);
	}
	public void run() {
		for(int i = 0 ;i < 3; i++) {
			try {
				sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(getName()+":How are you?");
			System.out.println(getName()+":Fine Thank you!");
		}
	}
}
public class t1 {
	
public static void main(String[] args) {
	mythread h1=new mythread("线程1");
	mythread h2=new mythread("线程2");
	h1.start();
	h2.start();	
}
}

运行结果:

线程1:How are you?
线程1:Fine Thank you!
线程2:How are you?
线程2:Fine Thank you!
线程1:How are you?
线程2:How are you?
线程2:Fine Thank you!
线程1:Fine Thank you!
线程1:How are you?
线程2:How are you?
线程2:Fine Thank you!
线程1:Fine Thank you!

这是一个非常关键的问题! 你提到: > “上下文结构体封装很好用。但是我这里有很多个结构体,可以每个结构体都初始化一次吗?” 我们要明确一点:**`mbedtls_ctr_drbg_context` `mbedtls_entropy_context` 是昂贵的全局资源,不能随意重复初始化或销毁**。 --- ## ✅ 简短回答: > ❌ **不可以!你不应该让每一个结构体都独立初始化自己的 `entropy + ctr_drbg` 上下文。** > > ✅ 正确做法是:**多个结构体共享同一个已初始化的 RNG 上下文指针(即 `mbedtls_ctr_drbg_context*`)** --- ## 🧠 为什么不能每个结构体都初始化一次? ### 1. **性能开销大** - `mbedtls_entropy_init()` 会尝试访问硬件熵源(如 `/dev/random`, `RNG peripheral`) - `mbedtls_ctr_drbg_seed()` 需要采集足够的熵数据,可能阻塞 - 多次调用 = 多次系统调用、多次熵采集 → 慢、不可预测延迟 ### 2. **资源浪费** - 每个 `ctr_drbg` 实例都有内部缓冲区、状态机 - 创建太多实例 → 内存浪费(尤其在嵌入式设备上) ### 3. **可能导致熵耗尽** - 特别是在嵌入式平台或虚拟机中,熵池有限 - 频繁创建/销毁 DRBG 实例会导致 `mbedtls_ctr_drbg_seed()` 失败 ### 4. **违反单一职责原则** - 应该由“主控模块”统一管理 RNG 生命周期 - 每个子模块只负责使用,不负责创建 --- ## ✅ 推荐方案:共享一个 DRBG 上下文 ### ✅ 方案一:所有结构体持有 `mbedtls_ctr_drbg_context*` 指针 ```c // common.h #ifndef COMMON_H #define COMMON_H #include "mbedtls/ctr_drbg.h" typedef struct module_a { mbedtls_ctr_drbg_context *rng; // 不拥有,仅引用 int state; } module_a_t; typedef struct module_b { mbedtls_ctr_drbg_context *rng; char name[16]; } module_b_t; #endif ``` 初始化时传入同一个 RNG: ```c // main.c mbedtls_ctr_drbg_context global_drbg; // 全局或栈上创建 // 初始化一次 mbedtls_ctr_drbg_seed(&amp;global_drbg, mbedtls_entropy_func, &amp;entropy, NULL, 0); module_a_t mod_a = { .rng = &amp;global_drbg }; module_b_t mod_b = { .rng = &amp;global_drbg }; // 使用 unsigned char key[32]; mbedtls_ctr_drbg_random(mod_a.rng, key, 32); ``` ✅ 所有模块共用一个 RNG,高效且安全。 --- ### ✅ 方案二:通过“主上下文”聚合(推荐用于大型项目) 定义一个顶层上下文,其他模块通过它获取 RNG: ```c // app_ctx.h typedef struct { mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context drbg; // 其他全局资源... } app_context_t; extern app_context_t g_app_ctx; // 全局实例(唯一) ``` 各模块结构体持有一个指向主上下文的指针: ```c typedef struct crypto_module { app_context_t *app_ctx; // 引用主上下文 } crypto_module_t; ``` 使用时: ```c mbedtls_ctr_drbg_random(ctx->app_ctx->drbg, buf, len); ``` > ⚠️ 注意:这不是“每个结构体初始化一次”,而是“所有结构体共享同一个”。 --- ### ✅ 方案三:自动注入式设计(高级) 如果你希望更灵活,可以用“构造函数”模式初始化模块,并传入 RNG: ```c int module_a_init(module_a_t *mod, mbedtls_ctr_drbg_context *rng) { if (!mod || !rng) return -1; mod->rng = rng; mod->state = 0; return 0; } ``` 调用: ```c module_a_t a1, a2, b1; module_a_init(&amp;a1, &amp;global_drbg); module_a_init(&amp;a2, &amp;global_drbg); ``` ✅ 完全避免重复初始化,清晰可控。 --- ## ❌ 错误示范(禁止!) ```c typedef struct bad_module { mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context drbg; } bad_module_t; void bad_init(bad_module_t *mod) { mbedtls_entropy_init(&amp;mod->entropy); // ❌ 每个实例都初始化! mbedtls_ctr_drbg_init(&amp;mod->drbg); mbedtls_ctr_drbg_seed(&amp;mod->drbg, mbedtls_entropy_func, &amp;mod->entropy, NULL, 0); } ``` 👉 如果你有 10 个这样的模块实例,就会: - 调用 10 次熵采集 - 占用 10 倍内存 - 增加失败概率 --- ## 🔐 安全建议:如何防止意外重复初始化? 你可以添加运行时检查: ```c static int is_seeded = 0; int safe_seed(mbedtls_ctr_drbg_context *ctx, mbedtls_entropy_context *entropy) { if (is_seeded) return 0; // 已经初始化过了 int ret = mbedtls_ctr_drbg_seed(ctx, mbedtls_entropy_func, entropy, NULL, 0); if (ret == 0) { is_seeded = 1; } return ret; } ``` 或者使用 **断言** 在调试阶段发现问题: ```c assert(ctx->f_random == NULL); // 确保未初始化 ``` --- ## ✅ 总结:最佳实践清单 | 原则 | 做法 | |------|------| | ✅ 只初始化一次 | 在程序启动时创建并播种 `ctr_drbg` | | ✅ 多个结构体共享 | 所有结构体保存 `mbedtls_ctr_drbg_context*` 指针 | | ✅ 不拥有生命周期 | 结构体不负责 `free`,仅使用 | | ✅ 统一管理 | 由主模块或应用上下文管理 RNG 生命周期 | | ❌ 禁止重复初始化 | 避免每个结构体自己调用 `seed` | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值