饿汉式栈的非阻塞实现研究_第1页
饿汉式栈的非阻塞实现研究_第2页
饿汉式栈的非阻塞实现研究_第3页
饿汉式栈的非阻塞实现研究_第4页
饿汉式栈的非阻塞实现研究_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1/1饿汉式栈的非阻塞实现研究第一部分饿汉式栈的阻塞和非阻塞对比 2第二部分非阻塞饿汉式栈的设计原则 3第三部分乐观同步实现的并发控制 5第四部分引用计数与CAS操作的协作 8第五部分多线程安全性的验证方法 11第六部分非阻塞栈的性能优化策略 12第七部分饥饿和活锁问题的解决 14第八部分非阻塞饿汉式栈在实际应用中的优势 16

第一部分饿汉式栈的阻塞和非阻塞对比饿汉式栈的阻塞和非阻塞对比

阻塞式饿汉式栈

*特点:当栈为空时,线程将被阻塞,直到其他线程将元素压入栈中。

*缺点:可能导致死锁,因为多个线程可能会等待同一个栈。

非阻塞式饿汉式栈

*特点:当栈为空时,线程不会被阻塞,而是返回特殊值(例如`nullptr`)。

*优点:避免了死锁,提高了并发性。

性能对比

吞吐量:

*非阻塞式饿汉式栈的吞吐量通常高于阻塞式饿汉式栈,因为线程不必等待元素被压入栈中。

延迟:

*对于轻负载,阻塞式饿汉式栈的延迟通常较低,因为线程可以快速获得元素。

*对于重负载,非阻塞式饿汉式栈的延迟通常较低,因为线程不必等待栈解锁。

内存开销:

*非阻塞式饿汉式栈通常具有较高的内存开销,因为需要额外的空间来存储特殊值(例如`nullptr`)。

实际场景中的应用

阻塞式饿汉式栈:适用于轻负载场景,其中线程不太可能长时间等待元素。

非阻塞式饿汉式栈:适用于重负载场景,其中线程可能长时间等待元素,或者需要避免死锁。

具体数据对比

以下表格总结了阻塞式和非阻塞式饿汉式栈的性能对比数据:

|特征|阻塞式饿汉式栈|非阻塞式饿汉式栈|

||||

|吞吐量|较低|较高|

|延迟|较低(轻负载)|较低(重负载)|

|内存开销|较低|较高|

|并发性|低|高|

结论

非阻塞式饿汉式栈在并发性、吞吐量和延迟方面通常优于阻塞式饿汉式栈。然而,它的内存开销也更高。在实际应用中,选择哪种栈取决于具体的场景和性能需求。第二部分非阻塞饿汉式栈的设计原则关键词关键要点【空间优化】

1.采用按需分配机制,仅在需要时分配内存,避免不必要的空间浪费。

2.使用轻量级数据结构,如链表或数组,最小化内存开销。

3.探索压缩技术,如run-length编码,以进一步优化空间利用率。

【并发控制】

非阻塞饿汉式栈的设计原则

非阻塞饿汉式栈的设计原则着重于消除传统阻塞式饿汉式栈中可能出现的线程阻塞问题,从而提高栈的并发访问效率。其主要设计原则包括:

1.CAS原子操作:

使用CAS(比较并交换)原子操作来更新栈顶指针,避免多线程同时操作栈顶时发生的竞争条件。具体而言:

*在压栈操作中,比较旧的栈顶指针是否与当前栈顶指针相等,如果相等,则交换当前栈顶指针和新元素指针。

*在弹栈操作中,比较旧的栈顶指针是否与当前栈顶指针相等,如果相等,则将下一个元素设置为新栈顶指针。

2.非阻塞算法:

采用非阻塞算法,在CAS操作失败时不进行线程阻塞,而是不断重试,直至成功。这避免了线程在等待CAS成功时被阻塞,从而提高了并发性。

3.伪共享优化:

伪共享问题是指不同线程访问位于同一缓存行的变量时,由于缓存一致性协议而导致的性能下降。非阻塞饿汉式栈通过对栈顶指针和栈元素进行对齐和填充,减少伪共享的发生。

4.负载均衡:

设计多个栈实例并采用负载均衡机制,将并发访问分散到不同的栈上,降低单个栈的负载压力。

5.无锁队列:

将压栈和弹栈操作封装为无锁队列,队列中存储等待执行的元素。这样,多个线程可以同时将元素加入或从队列中取出,而无需锁机制的同步。

6.存储屏障和内存屏障:

使用存储屏障和内存屏障来确保不同线程对共享内存的访问顺序一致。存储屏障用于将对共享内存的修改操作强制提交到内存中,内存屏障用于强制从内存中读取最新的共享内存值。

7.乐观并发:

采用乐观并发机制,假设CAS操作总是成功。当CAS操作失败时,会回滚已执行的操作并重试。这避免了不必要的锁定,提高了并发性。

8.数据结构优化:

使用数组或链表等数据结构来实现栈,并进行适当的优化,以提高访问速度和减少内存开销。例如,数组实现可以采用循环数组的方式,减少元素移动和复制的开销。

9.可扩展性:

设计可扩展的非阻塞饿汉式栈,支持根据需要增加或减少栈实例的数量。这可以适应不同负载情况下的性能要求。第三部分乐观同步实现的并发控制关键词关键要点乐观同步实现的并发控制

1.乐观并发控制:在并发执行过程中,假定冲突发生的概率低,因此允许多个线程同时访问共享数据,并在冲突发生时再进行处理。

2.版本控制:为每个共享数据维护一个版本号,当数据被修改时,版本号会随之增加。每个线程在访问数据时,都会记录其当前的版本号。

3.无锁实现:乐观并发控制通常使用无锁实现,即不使用锁机制来防止冲突,而是依赖于版本控制机制来保证数据的正确性。

非阻塞栈

1.非阻塞算法:非阻塞栈是一种数据结构,它保证在任何情况下,都不会发生阻塞。即使在并发访问的情况下,任何线程都可以随时访问栈,而不会被其他线程阻塞。

2.乐观并发实现:非阻塞栈通常使用乐观并发控制来实现,允许多个线程同时访问栈,并在冲突发生时再进行处理。

3.简单和高效:非阻塞栈的实现相对简单,并且具有高吞吐量,使其适用于高并发场景。乐观同步实现的并发控制

概述

乐观同步是一种并发的访问控制策略,允许线程同时访问共享数据,并在提交更新之前检查是否存在冲突。与悲观同步(如加锁)不同,乐观同步仅在更新期间进行冲突检测,从而避免了对共享数据的持续阻塞。

实现

乐观同步通过以下步骤实现:

1.加载:线程从共享数据结构中加载一个版本。

2.修改:线程在本地副本上执行所需的修改。

3.验证:提交之前,线程检查版本是否已更改。

4.保存:如果版本未更改,则线程提交更新,否则它将重新加载数据并重试。

冲突解决

如果在提交期间检测到冲突,乐观同步将采用以下冲突解决策略之一:

*回滚:线程回滚其修改并重新加载数据。

*重试:线程重试更新,希望在再次尝试时不会发生冲突。

*合并:线程尝试合并其修改与冲突线程的修改。

优点

*高并发:乐观同步允许多个线程同时访问共享数据,从而提高了并发性。

*低开销:与悲观同步相比,乐观同步的开销较低,因为它避免了持续的锁争用。

*可伸缩性:乐观同步可扩展到具有大量并发线程的大型系统。

缺点

*冲突检测:乐观同步仅在提交期间检测冲突,如果在修改期间冲突频繁发生,这可能会导致性能下降。

*ABA问题:乐观同步对ABA问题很敏感,即一个值在无锁的情况下由A→B→A更新,导致冲突检测失败。

*事务性支持有限:乐观同步通常不支持完全事务性操作,因为它不允许回滚在提交之前执行的修改。

应用

乐观同步广泛应用于高并发系统中,例如:

*数据库管理系统

*缓存系统

*并发数据结构

性能优化

为了优化乐观同步的性能,可以采用以下技术:

*乐观并发控制(OCC)版本:使用多个版本机制来减少冲突发生的概率。

*多版本并发控制(MVCC):使用时间戳来跟踪数据版本的历史记录。

*事务性内存(TM):提供硬件支持的原子操作,从而提高并发的效率。

结论

乐观同步是一种有效的并发控制策略,可以提高高并发系统中的性能。它通过在提交期间进行冲突检测来避免对共享数据的持续阻塞。尽管存在一些缺点,但乐观同步在许多实际应用中仍然是一个有价值的技术。第四部分引用计数与CAS操作的协作关键词关键要点引用计数

1.引用计数是一种跟踪对象引用次数的技术,当引用计数减为零时,表明该对象不再被引用,可以回收。

2.在非阻塞实现中,引用计数与原子操作相结合,以确保在多线程环境下对象的安全释放。

3.通过维护引用计数和比较器,可以避免锁竞争,提高吞吐量。

CAS操作

1.比较并交换(CAS)操作是一种原子操作,它比较指定内存位置的值与预期值,如果相等,则将该位置的值更新为新值。

2.在栈操作中,CAS用于原子地更新头指针,插入或删除元素,从而保证多线程之间的并发执行。

3.CAS操作的效率很高,因为它可以避免锁的开销,同时确保数据的完整性。引用计数与CAS操作的协作

在饿汉式栈的非阻塞实现中,引用计数与CAS(比较并交换)操作协作实现原子性的栈操作。引用计数跟踪栈内元素的数量,而CAS用于原子地更新栈指针。

引用计数

引用计数是一个整数,表示栈内元素的数量。每个元素都有一个引用计数,当该元素被压入栈时,其引用计数加1;当该元素被弹出时,其引用计数减1。引用计数为0表示该元素可以被安全地释放。

CAS操作

CAS操作是一个原子操作,用于更新栈指针。它将栈指针的当前值与预期的值进行比较。如果两者相等,则将栈指针更新为新的值。如果两者不相等,则CAS操作失败,并且栈指针保持不变。

协作

引用计数与CAS操作协作,确保栈操作的原子性。当一个元素被压入栈时:

1.栈指针指向栈顶元素。

2.栈顶元素的引用计数加1。

3.使用CAS操作将栈指针更新为该元素。

当一个元素被弹出时:

1.栈指针指向栈顶元素。

2.栈顶元素的引用计数减1。

3.如果栈顶元素的引用计数为0,则释放该元素。

4.使用CAS操作将栈指针更新为栈顶元素的前一个元素。

通过使用这种协作方式,引用计数和CAS操作确保了以下原子性保证:

*栈指针始终指向栈顶元素。

*栈顶元素的引用计数始终是正确的。

*元素在压入时立即可见,弹出时立即不可见。

性能优势

与加锁机制相比,引用计数和CAS操作协作的非阻塞实现具有以下性能优势:

*高吞吐量:由于避免了锁争用,因此可以支持更高的并发操作。

*低延迟:原子操作的开销较小,因此可以减少操作延迟。

*可扩展性:非阻塞实现可以轻松扩展到多核和分布式系统。

适用性

引用计数和CAS操作协作的非阻塞栈实现适用于以下场景:

*高并发环境:需要支持大量并发操作的应用程序。

*低延迟要求:需要最小化操作延迟的应用程序。

*可扩展性需求:需要轻松扩展到更大规模的应用程序。第五部分多线程安全性的验证方法多线程安全性的验证方法

在多线程环境下,验证饿汉式栈的非阻塞实现的安全性至关重要,以确保并发访问时的正确性和数据完整性。本文介绍了几种常用的验证方法:

1.单元测试

单元测试是最基本且广泛使用的验证方法。它涉及编写测试用例,模拟不同的线程交互场景,并验证栈在并发访问下的预期行为。单元测试可以覆盖最常见的错误,但可能会遗漏边缘情况。

2.线程竞争检测工具

线程竞争检测工具(如DataRaceSanitizer和ThreadSanitizer)可以检测多线程程序中的竞争条件,即多个线程同时访问共享数据而未进行适当的同步。这些工具可以识别诸如死锁、数据竞争和内存泄漏等问题。

3.静态分析

静态分析工具通过分析源代码来识别潜在的线程安全问题,而无需执行代码。它们可以检查锁定和同步机制的使用是否正确,并检测死锁和竞争条件的可能性。静态分析可以提供早期的见解,但其准确性可能受到代码复杂性的影响。

4.测试驱动开发(TDD)

TDD是一种软件开发方法,其中测试用例在编写代码之前编写。这有助于确保代码从一开始就设计为线程安全的,因为测试用例会强制执行明确的并发约束。

5.性能基准测试

性能基准测试可以评估栈的并发性能,包括吞吐量和延迟。通过在不同负载条件下对栈进行基准测试,可以识别潜在的性能瓶颈,并验证其在高并发场景下的可扩展性。

6.错误注入

错误注入是一种主动的验证方法,涉及故意向代码中引入错误,以观察系统的响应。这有助于识别未处理的异常,并在现实的故障条件下测试栈的鲁棒性。

7.生产环境监控

在生产环境中部署栈后,持续监控其性能和行为至关重要。日志记录、指标和警报可以提供有关线程安全性的见解,并帮助识别潜在的错误或性能下降。

通过结合这些验证方法,可以全方位地评估饿汉式栈的非阻塞实现的线程安全性。这些方法有助于确保在并发访问场景中数据的正确性和完整性,增强系统的可靠性和可用性。第六部分非阻塞栈的性能优化策略关键词关键要点【基于链表的非阻塞栈】:

1.采用链表结构存储数据,避免了锁争用问题。

2.通过原子操作更新栈顶指针,保证并发操作的正确性。

3.利用无锁链表实现,进一步提升了栈的并发性能。

【基于无锁队列的非阻塞栈】:

非阻塞栈的性能优化策略

1.减少锁竞争:

*加锁拆分:将栈操作拆分为多个较小的操作,每个操作使用单独的锁。减少了单一锁的竞争。

*无锁数据结构:使用无锁数据结构(如链表)来管理栈中的元素,从而完全避免锁竞争。

*读写分离:将读取操作与写入操作分离,并分别使用不同的锁。这允许同时进行读取和写入操作。

2.优化数据结构:

*链表:使用链表作为底层数据结构,可以支持高效的插入和删除操作。

*循环数组:使用循环数组实现栈,可以减少内存分配和释放的开销。

*跳表:使用跳表实现栈,可以提供高效的查找和插入操作。

3.线程池:

*使用线程池来管理栈操作的并发性。这可以减少线程创建和销毁的开销,提高性能。

4.内存管理:

*对象池:使用对象池来管理栈元素,减少对象分配和释放的开销。

*内存预分配:预先分配一批内存,用于栈操作,避免动态内存分配的开销。

5.并发控制:

*原子操作:使用原子操作(如CAS)来执行栈操作,确保操作的原子性和顺序性。

*版本控制:使用版本控制技术来管理并发栈操作的正确性。

*时间戳:使用时间戳来区分不同线程的栈操作,确保操作的顺序性。

6.性能监控:

*性能指标:监控关键性能指标,如吞吐量、延迟和锁竞争。

*性能分析:分析性能数据,识别性能瓶颈并采取优化措施。

*负载测试:进行负载测试,以评估栈在不同负载条件下的性能。

优化策略的具体实现:

在Java中,可以结合以下技术来实现非阻塞栈的性能优化:

*Java并发包中的`ConcurrentLinkedQueue`用于实现无锁链表。

*`AtomicReference`用于实现原子操作。

*`VersionedAtomicLong`(来自Java并发实用程序库)用于实现版本控制。

通过应用这些优化策略,非阻塞栈在高并发环境中可以实现高吞吐量、低延迟和可扩展性。第七部分饥饿和活锁问题的解决饥饿和活锁问题的解决

饥饿问题和活锁问题是饿汉式栈在并发环境下可能遇到的两个主要挑战。

饥饿问题

在饥饿问题中,某个线程无限期地等待获得某个资源,而其他线程却可以不断地获取该资源。在饿汉式栈中,饥饿问题可能发生在获取栈锁的线程上。如果一个线程长时间持有栈锁,则其他线程将无法获取栈并进行操作。

解决饥饿问题

为了解决饥饿问题,可以使用以下策略:

*公平锁:使用公平锁(如ReentrantLock),它保证每个线程都有机会获得锁。

*饥饿检测机制:引入一种饥饿检测机制,当某个线程长时间无法获取锁时,终止该线程并重新启动。

*队列机制:使用队列机制,允许多个线程排队等待获取锁。

活锁问题

活锁问题发生在两个或多个线程相互等待对方释放资源的情况下,导致所有线程都被阻塞。在饿汉式栈中,活锁问题可能发生在两个线程同时获取栈锁的情况下。

解决活锁问题

为了解决活锁问题,可以使用以下策略:

*超时机制:引入超时机制,当某个线程在指定时间内无法获取锁时,终止该线程。

*死锁检测与恢复:使用死锁检测算法(如Floyd's算法)定期检查是否存在死锁。如果检测到死锁,则终止涉及的线程并重新启动。

*优先级排序:为线程分配优先级,并确保高优先级线程可以优先获取锁。

具体实现

在饿汉式栈的非阻塞实现中,可以通过以下方式解决饥饿和活锁问题:

*使用公平锁:使用ReentrantLock作为栈锁。

*饥饿检测机制:每当一个线程在获取锁时遇到争用,则会记录争用次数。当争用次数达到一定阈值时,终止该线程并重新启动。

*队列机制:使用队列存储等待获取锁的线程。

*超时机制:设定一个超时时间,当某个线程超过超时时间仍未获取锁,则终止该线程。

*死锁检测与恢复:使用Floyd's算法定期检查死锁。如果检测到死锁,则终止涉及的线程并重新启动。

实验结果

通过实验评估,采用上述策略的饿汉式栈非阻塞实现可以有效地减少饥饿和活锁问题的发生。在高并发场景下,栈的吞吐量和延迟均得到显著改善。

结论

通过综合使用公平锁、饥饿检测机制、队列机制、超时机制和死锁检测与恢复技术,可以有效地解决饿汉式栈的饥饿和活锁问题,从而实现一个健壮且高效的非阻塞栈数据结构。第八部分非阻塞饿汉式栈在实际应用中的优势关键词关键要点【高并发环境支持】

*非阻塞饿汉式栈无需锁机制,在高并发场景下可以显著提升系统吞吐量。

*通过采用无锁队列或CAS操作,饿汉式栈可以同时支持多个线程并发操作。

*在大规模数据处理或分布式系统中,这种非阻塞特性至关重要,确保系统响应速度和稳定性。

【可扩展性和灵活性】

非阻塞饿汉式栈在实际应用中的优势

高并发性

饿汉式栈采用预先分配内存的方式,在栈初始化时就分配好所有的内存空间。这种方式的好处在于,在栈进行入栈操作时,不需要再额外分配内存,从而避免了内存分配的阻塞问题。

在高并发场景下,多个线程同时操作栈时,非阻塞饿汉式栈可以保证每个线程都能快速、高效地执行入栈操作,从而提高并发处理能力。

低延迟

由于非阻塞饿汉式栈在初始化时就分配好了所有内存空间,因此在进行入栈操作时,无需等待内存分配完成,直接将数据写入预分配的内存区域即可。

这种方式有效降低了入栈操作的延迟,特别是在对延迟要求较高的实时系统中,非阻塞饿汉式栈可以有效保证数据处理的及时性。

空间利用率高

饿汉式栈在初始化时一次性分配所有内存空间,这种方式可以有效避免内存碎片问题,从而提高内存空间的利用率。

特别是在处理大量数据时,非阻塞饿汉式栈可以最大限度地利用内存空间,减少内存浪费,提高系统整体性能。

代码简洁易维护

非阻塞饿汉式栈的实现相对简单,代码逻辑清晰易懂,便于维护和扩展。

在实际应用中,非阻塞饿汉式栈可以作为一种高效、可靠的数据结构,广泛应用于并发编程、实时系统和数据存储等领域。

应用实例

*消息队列:非阻塞饿汉式栈可以作为消息队列的底层数据结构,实现消息的快速收发,满足高并发和低延迟的需求。

*任务调度:非阻塞饿汉式栈可以用于任务调度,对任务进行入栈和出栈操作,保证任务有序执行,提高系统吞吐量。

*数据缓冲:非阻塞饿汉式栈可以作为数据缓冲区,用于存储临时的数据,实现数据读写的解耦,提高系统效率。

*并发队列:非阻塞饿汉式栈可以作为并发队列的数据结构,实现多线程之间的安全数据交换,满足高并发和无死锁的需求。

性能对比

下表对比了非阻塞饿汉式栈与其他栈实现方式的性能:

|栈实现方式|内存分配|入栈延迟|吞吐量|

|||||

|非阻塞饿汉式栈|预分配|低|高|

|非阻塞懒汉式栈|按需分配|较高|中等|

|同步阻塞栈|同步锁|高|低|

从表中可以看出,非阻塞饿汉式栈在入栈延迟和吞吐量方面具有明显的优势,特别适合高并发和低延迟的场景。

结论

非阻塞饿汉式栈是一种高效、可靠的数据结构,具有高并发性、低延迟、空间利用率高和代码简洁易维护等优点。在实际应用中,非阻塞饿汉式栈广泛应用于消息队列、任务调度、数据缓冲和并发队列等场景,有效提升了系统的性能和可靠性。关键词关键要点主题名称:并发性对比

关键要点:

1.饿汉式栈的阻塞实现(即使用锁机制)在并发环境下,由于锁竞争的存在,会导致线程阻塞,影响性能。

2.饿汉式栈的非阻塞实现(即使用无锁机制)通过消除锁竞争,实现线程并发访问,从而显著提升性能。

主题名称:实时性

关键要点:

1.阻塞实现的饿汉式栈在高并发场景下,由于锁竞争的存在,可能导致访问延迟,影响实时性要求。

2.非阻塞实现的饿汉式栈通过消除锁竞争,保证了线程的高效并发访问,从而提高了整体的实时响应能力。

主题名称:内存开销

关键要点:

1.阻塞实现的饿汉式栈因使用锁机制,需要额外的内存空间存储锁对象,导致一定的内存开销。

2.非阻塞实现的饿汉式栈通过使用无锁机制,省去了锁对象的内存占用,从而减少了内存开销。

主题名称:可扩展性

关键要点:

1.阻塞实现的饿汉式栈在并发环境下,锁竞争的加剧会限制其可扩展性,难以应对高并发场景。

2.非阻塞实现的饿汉式栈通过消除锁竞争,提高了线程并发访问的吞吐量,从而增强了系统的可扩展性,可以更好地适应高并发场景。

主题名称:复杂度

关键要点:

1.阻塞实现的饿汉式栈使用锁机制实现同步,代码逻辑相对简单。

2.非阻塞实现的饿汉式栈采用无锁机制实现并发访问,代码逻辑相对复杂,需要考虑并发安全和数据一致性等问题。

主题名称:应用场景

关键要点:

1.阻塞实现的饿汉式栈适用于对实时性要求不高的场景,如数据缓存、队列等。

2.非阻塞实现的饿汉式栈适用于对实时性、可扩展性、并发性要求较高的场景,如高频交易系统、在线游戏等。关键词关键要点主题名称:静态分析

关键要点:

-审查代码以发现潜在的竞争条件和线程安全漏洞,例如未同步的数据结构访问。

-使用静态分析工具,如LockDector和ThreadSanitizer,自动检测这些问题。

-通过分析代码流和数据依赖性,识别可能导致并行执行时数据竞争的代码路径。

主题名称:运行时检测

关键要点:

-在运行时监控程序执行,并检测违反线程安全规则的情况,例如不正确的锁顺序和丢失的解锁操作。

-使用数据竞争检测工具,如Valgrind和IntelInspector,在多线程环境中执行代码并报告违规行为。

-实时分析内存访问模式和锁获取顺序,以识别并行执行期间的潜在问题。

主题名称:形式验证

关键要点:

-使用形式化方法,如模型检查和定理证明,证明代码的线程安全性属性。

-建立代码的数学模型,并定义形式规范以描述预期行为。

-使用工具自动验证模型是否满足规范,从而确保代码在所有可能的执行路径中都是线程安全的。

主题名称:测试

关键要点:

-设计和执行并发测试用例,以在真实的运行时环境中验证线程安全性。

-使用多线程测试框架,如JUnit和Mockito,创建并发线程并在不同情况下测试代码的行为。

-通过随机生成测试数据和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论